我将旧的Web应用程序从Tomcat转换为JBoss EAP 6.4。它的REST服务一直在使用我删除的Jersey,因为JBoss EAP 6.4包含RESTeasy,资源只使用jax-rs注释。
对于每项服务,我添加了一个应用程序扩展java.ws.rs.core.Application
,例如:
package x.rest.external;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class ExternalApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<>();
classes.add(ResourceY.class);
classes.add(ResourceZ.class);
return classes;
}
}
我想不使用RESTeasy或JBoss特定方法来声明此服务:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
[...]
<servlet>
<servlet-name>x.rest.external.ExternalApplication</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>x.rest.external.ExternalApplication</servlet-name>
<url-pattern>/rest/external/*</url-pattern>
</servlet-mapping>
[...]
>
据我所知,从规范和各种网络资源中,这应该足以让服务启动并运行。但如果我调用该服务,我得到的是:
10:54:51,630 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/x]] (ServerService Thread Pool -- 44) JBWEB000289: Servlet x.rest.external.ExternalApplication threw load() exception: javax.servlet.ServletException: JBWEB000260: No servlet class has been specified for servlet x.rest.external.ExternalApplication
我知道有一些方法可以使用一些RESTeasy servlet或仅使用注释配置。我希望应用程序尽可能保持容器独立性,并认为基本路径都应该在web.xml
描述符中声明。
编辑:似乎归结为RESTEASY-650和RESTEASY-738已在RESTeasy 3.x中修复,但JBoss EAP 6.4附带2.3.x.
要避免org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011232: Only one JAX-RS Application Class allowed
例外,我要禁用web.xml中的所有resteasy扫描:
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.providers</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.resources</param-name>
<param-value>false</param-value>
</context-param>
反过来让JBoss对未指定的servlet感到窒息:javax.servlet.ServletException: JBWEB000260: No servlet class has been specified
。
如果我使用@ApplicationPath
和web.xml
声明都禁用了除一个JAX-RS应用程序以外的所有应用程序。
编辑2:在JBoss EAP 7.0测试版中运行良好。