java - Jboss 7 上的 Jersey 2

标签 java jboss jersey jboss7.x jersey-2.0

有人成功地使用 JBoss 7.x 部署了 Jersey 2.x 吗?我尝试使用 JBoss 7.1.1 部署 Jersey 2.5,但遇到如下错误:

"java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;"

我认为这个问题是因为 JBoss 与 RestEasy 捆绑在一起,RestEasy 是 JAX-RS 1.0 实现,而 Jersey 是 JAX-RS 2.0 实现。所以我采取了以下步骤来禁用 RestEasy:

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) 关注讨论 here ,我修改了 JBoss 的 standalone.xml、module.xml 和 domain.xml 以删除对 JAXRS1.1/RestEasy 的所有引用。

3) 这导致了另一个错误:“java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor”,我通过将以下内容添加到我的 pom.xml 中解决了这个问题:

<dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
</dependency>

最后我的应用程序部署没有错误,但现在我似乎无法访问我的任何 Jersey 资源。然而,Jetty 8 工作正常。我还能够运行 Jersey 1.x 而无需执行步骤 #2 和 #3,但如果可能的话我更愿意使用 Jersey 2.x。

此外,我还尝试创建一个 jboss-deployment-structure.xml 文件,但我仍然遇到之前的错误,如“java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/ map ;”

<?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-jackson-provider"/>  
            <module name="org.jboss.resteasy.resteasy-jaxb-provider"/>  
            <module name="org.jboss.resteasy.resteasy-jaxrs"/>  
            <module name="org.jboss.resteasy.resteasy-jettison-provider"/>  
            <module name="org.jboss.resteasy.resteasy-jsapi"/>  
            <module name="org.jboss.resteasy.resteasy-multipart-provider"/>  
            <module name="org.jboss.resteasy.resteasy-yaml-provider"/>  
            <module name="org.apache.log4j"/>  
            <module name="org.apache.commons.pool"/>  
            <module name="javax.ws.rs.api"/>
    </exclusions>
  </deployment>
</jboss-deployment-structure>

有人对 Jboss 和 Jersey 2.x 有好感吗?任何帮助将不胜感激。

最佳答案

如果您像这样配置您的jboss-deployment-structure.xml,您可以在 JBoss 7 上使用 Jersey 2:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>

<exclude-subsystems>
  <subsystem name="resteasy" />
</exclude-subsystems>

<exclusions>
  <module name="javaee.api" />
  <module name="javax.ws.rs.api"/>
  <module name="org.jboss.resteasy.resteasy-jaxrs" />
</exclusions>

<local-last value="true" />

</deployment>
</jboss-deployment-structure>

因为JBoss 7包含了模块的依赖,排除resteasy模块本身是不够的,还需要排除整个javaee.api模块。还要确保不要排除太多模块。这也可能会破坏您的应用程序 - 上面的示例足以禁用 resteasy。

正如您已经发现的,您仍然需要在您的 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>

关于java - Jboss 7 上的 Jersey 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21173397/

相关文章:

java - 有没有办法让JavaSound使用您SO上安装的编解码器?

java - Maven EAR 项目 - JAR 未被排除?

jboss - 如何配置 Eclipse (Kepler) 以使用 Wildfly

java - NoClassDefError com.sun.jersey.api.client.Client

java - 在 ExceptionMapper<Throwable> 中捕获 JsonMappingException

java - Jersey-test-framework 无用的回溯 JerseyTest

java - Kotlin 的类型具体化使哪些在 Java 或 Scala 中无法实现的成为可能?

java算法: find pre/next leaf node that meet special condition from any node in a tree

java - 奇怪的 JFrame 行为

java - 在Spring中加载ResourceBundle对象