带有Jersey的JAX-RS在JBoss AS中不起作用



我正在尝试将简单的REST服务上传到JBoss AS 7.1(或TomEE JAX-RS)上。

我的web.xml:

<servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.javacodegeeks.jersey.main</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/rs/*</url-pattern>
</servlet-mapping>

依赖pom.xml:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.9</version>
</dependency>

服务器端点:

@Path("account")
public class AccountDetailsService {
    @GET
    @Path("/details/{param}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response getAccountDetails(@PathParam("param") String accountName) {
        String output = "Account Name : " + accountName;
        return Response.status(200).entity(output).build();
    }
}

但我得到了这个错误:

17:37:00,450 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Fai led to start service
jboss.deployment.unit."jersey-example.war".POST_MODULE: org.jboss.msc.service.StartException in service
jboss.deployment.unit."jersey-example.war".POST_MODULE: Failed to process phase POST_MODULE of deployment "jersey-example.war"
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:119) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_80-ea]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_80-ea]
        at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_80-ea] Caused by:org.jboss.as.server.deployment.DeploymentUnitProcessingException:
JBAS01123 2: Only one JAX-RS Application Class allowed. 
com.sun.jersey.api.core.ClasspathResour ceConfig
com.sun.jersey.api.core.ResourceConfig
com.sun.jersey.api.core.PackagesResour ceConfig
com.sun.jersey.api.core.DefaultResourceConfig
com.sun.jersey.api.core.WebAppR esourceConfig
com.sun.jersey.server.impl.application.DeferredResourceConfig
com.sun.je rsey.api.core.ClassNamesResourceConfig
com.sun.jersey.api.core.ScanningResourceConfig
com.sun.jersey.api.core.ApplicationAdapter
        at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.scan(JaxrsScanningProcessor.java:209)
        at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.deploy(JaxrsScanningProcessor.java:105)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113)[jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        ... 5 more

如果Tomcat7容器上也能正常工作,为什么会发生这种情况?


更新:

20:15:03,078 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC00001: Failed to start service jboss.web.dep
loyment.default-host./ROOT: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./ROOT: Fai
led to start service
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.2.G
A.jar:1.0.2.GA]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
        at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]
Caused by: java.lang.IllegalStateException: JBAS018038: Root contexts can not be deployed when the virtual host configur
ation has the welcome root enabled, disable it and redeploy
        at org.jboss.as.web.deployment.WebContextInjector.inject(WebContextInjector.java:57)
        at org.jboss.as.web.deployment.WebContextInjector.inject(WebContextInjector.java:38)
        at org.jboss.msc.inject.CastingInjector.inject(CastingInjector.java:55) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl.doInject(ServiceControllerImpl.java:1549) [jboss-msc-1.0.2.GA.jar
:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl.access$1900(ServiceControllerImpl.java:49) [jboss-msc-1.0.2.GA.ja
r:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.performInjections(ServiceControllerImpl.java:1780) [jbo
ss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1741) [jboss-msc-1.0.2.G
A.jar:1.0.2.GA]
        ... 3 more

错误

JBAS011232:只有一个JAX-RS应用程序类允许

给你一个关于这个问题的提示。JBoss7使用RESTEasy作为JAX-RS实现。您的应用程序正在使用Jersey。看起来Jersey和RESTEasy在JBoss 7中相处得不太好。

要在JBoss7中使用Jersey作为JAX-RS实现,您需要禁用RESTEasy,它在JBoss 7中默认绑定。

尝试将以下行添加到web.xml:

<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>

如果不起作用,请在WEB-INF文件夹下创建一个名为jboss-deployment-structure.xml的文件,其中包含以下内容以排除RESTEasy模块:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-atom-provider" />
            <module name="org.jboss.resteasy.resteasy-cdi" />
            <module name="org.jboss.resteasy.resteasy-jaxrs" />
            <module name="org.jboss.resteasy.resteasy-jaxb-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
            <module name="org.jboss.resteasy.resteasy-jsapi" />
            <module name="org.jboss.resteasy.resteasy-multipart-provider" />
            <module name="org.jboss.resteasy.async-http-servlet-30" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

错误

JBAS018038:当虚拟主机配置启用了欢迎根时,无法部署根上下文,请禁用它并重新部署

当您试图将应用程序部署到根上下文时(在jboss-web.xml中使用名称ROOT.war/上下文),但AS欢迎页面已经占据了这个位置。

要解决此问题,请关闭服务器并编辑standalone.xml:

<subsystem xmlns="urn:jboss:domain:web:1.2" default-virtual-server="default-host" 
    native="false">  
    <virtual-server name="default-host" enable-welcome-root="false">  
    ...  
</subsystem>

有关更多详细信息,请查看此处。

解决方案非常不明显。。。

1) 以下行已添加到web.xml中:

<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>

2) web xml的下一行被注释掉了:

<!--<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.javacodegeeks.jersey.main</param-value>
</init-param>-->

3) 无需创建jboss部署结构.xml或编辑standalone.xml.

最新更新