泽西2在Jboss 7上

时间:2014-01-16 21:36:34

标签: 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,这是一个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>

所以最后我的应用程序部署没有错误,但现在我似乎无法访问我的任何泽西资源。但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 /地图;“

<?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有没有运气?任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:14)

如果您配置 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>

答案 1 :(得分:3)

这与此question

类似

只有不同的子系统可以复制/粘贴。

您应该排除jaxrs子系统被激活以进行部署 将其添加到META-INF / jboss-deployment-structure.xml

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
      <deployment>
         <!-- exclude-subsystem prevents a subsystems deployment unit processors running on a deployment -->
         <!-- which gives basically the same effect as removing the subsystem, but it only affects single deployment -->
         <exclude-subsystems>
            <subsystem name="jaxrs" />
        </exclude-subsystems>

         <!-- This is needed in any case even if you don't use exclude-subsystem above-->        
         <exclusions>  
          <module name="javax.ws.rs.api" />  
        </exclusions>  
      <deployment>
     </jboss-deployment-structure>

或者您可以转到standalone.xml并删除子系统。 为此,您需要删除

<subsystem xmlns="urn:jboss:domain:jaxrs:1.x">
...
...
<subsystem>

配置的一部分,顶部的扩展部分可以保持它不会伤害任何方式。 或者您可以使用CLI连接到服务器并运行

/subsystem=jaxrs:remove()

无论如何,我建议在AS7 https://docs.jboss.org/author/display/AS72/Class+Loading+in+AS7

中阅读有关类加载的内容

只需注意,排除子系统功能和部署结构:在7.1.2 中添加了1.2 ,因此无法在7.1.1上使用。

您仍然可以删除jaxrs子系统,但这会影响整个服务器。

答案 2 :(得分:1)

我几乎遇到了同样的问题(https://stackoverflow.com/a/38273524/4534078):

&#34;需要运行 Jersey 2.23.1 网络应用,已经在 JBoss 7.1.1中的Tomcat7上运行。&#34;

不幸的是,这里没有任何内容对我有用,但有些内容很方便我带着最终的解决方案:

  1. 关闭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>
    
  2. 使用&#34; jaxrs&#34;删除所有标签来自standalone.xml。否则你仍然会面临LinkageError,因为JBoss保持1.1规范&#34; on&#34;。

  3. 创建yourApp.war!WEB-INF \ jboss-deployment-structure.xml,就像这里指出的那样:https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7#ClassLoadinginAS7-JBossDeploymentStructureFile

  4. 这样,不仅:

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

    Disapears,但是,JAXB工作正常(模块ClassNotFoundException for javax.xml.bind.JAXBException也被激活后无javax.xml.bind.api。)

    Obs1 :最初的问题是将球衣1.x与球衣2.x混合。在球衣2.x中没有PojoMappingFeature,基础包是org.glassfish.jersey。看看https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

    Obs2 :我还尝试过其他方法,例如扩展ResourceConfig并从那里扫描包或直接注册类。没有什么能像第3项中的正确文档那样工作。所以保持我的servlet不受影响:

        <servlet>
          <servlet-name>WebNize REST Service</servlet-name>
          <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
          <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>br.com.webnize.rest.service</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
          <servlet-name>WebNize REST Service</servlet-name>
          <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    

    我希望它有所帮助!

答案 3 :(得分:0)

这是对我有用的组合(大部分来自本文中的其他答案 - 感谢所有人!)。

  1. Jersey 2.22.1 + JBoss EAP 6.4(基于JBoss AS 7.5)
  2. 通过jboss-deployment-structure.xml
  3. 排除jaxrs和resteasy子系统
  4. 未在任何JBoss模块中进行更改,因为这样做导致其他内容无法在我的环境中运行
  5. 通过web.xml中的上下文参数禁用了resteasy扫描,正如其他人指出的那样
  6. 为提供者类取出了Jersey init-param,而是实现了一个javax.ws.rs.core.Application来自我注册我的Jersey资源类
  7. 此时Web应用程序已成功部署且没有错误,但我正在试图访问我的REST服务。

    1. 我做的最后一件事是在web.xml中,我将Jersey从servlet更改为过滤器并开始工作

答案 4 :(得分:0)

Clemens82's answer开始,在排除 javaee.api 模块后,我遇到了这个问题:

java.lang.NoClassDefFoundError: javax/xml/ws/Endpoint
    at java.lang.Class.getDeclaredMethods0(Native Method) [rt.jar:1.7.0_72]
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) [rt.jar:1.7.0_72]
    at java.lang.Class.getDeclaredMethods(Class.java:1860) [rt.jar:1.7.0_72]
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152) [spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE]

要修复它,我必须将 javax.xml.ws.api 依赖项添加到jboss-deployment-structure.xml中。另外,我添加了 javax.servlet.api ,因为如果使用servlet,它应该由容器提供。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="javax.xml.ws.api" /> <!-- Required due to exclusion of javaee.api below -->
            <module name="javax.servlet.api" /> <!-- Required due to exclusion of javaee.api below -->
        </dependencies>
        <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>