簡體   English   中英

澤西2在Jboss 7上

[英]Jersey 2 on Jboss 7

有沒有人成功使用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)在這里討論之后,我修改了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有沒有運氣好嗎? 任何幫助,將不勝感激。

如果配置與此類似的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>

這與此問題類似

所以只需要不同的子系統即可復制/粘貼。

您應該排除為部署激活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子系統,但這會影響整個服務器。

我幾乎有同樣的問題( https://stackoverflow.com/a/38273524/4534078 ):

“需要運行Jersey 2.23.1網絡應用程序,已經在JBoss 7.1.1中的 Tomcat7上運行

不幸的是,這里沒有任何東西對我有用,但是有些東西很方便帶我走向最終的解決方案:

  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. 從standalone.xml中刪除所有帶有“jaxrs”的標簽。 否則你仍將面臨LinkageError,因為JBoss保持1.1規范“on”。

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

這樣,不僅:

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

消失,但是,JAXB工作正常(一旦模塊javax.xml.bind.api也被激活, ClassNotFoundException for javax.xml.bind.JAXBException沒有ClassNotFoundException for javax.xml.bind.JAXBException )。

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>

我希望它有所幫助!

這是對我有用的組合(大部分來自這篇文章中的其他答案 - 感謝大家!)。

  1. Jersey 2.22.1 + JBoss EAP 6.4(基於JBoss AS 7.5)
  2. 通過jboss-deployment-structure.xml排除jaxrs和resteasy子系統
  3. 沒有在任何JBoss模塊中進行更改,因為這樣做導致其他東西無法在我的環境中工作
  4. 正如其他人所指出的那樣,通過web.xml中的上下文參數禁用了resteasy掃描
  5. 為提供者類取出了Jersey init-param,而是實現了一個javax.ws.rs.core.Application來自我注冊我的Jersey資源類

此時Web應用程序已成功部署且沒有錯誤,但我正在嘗試404嘗試訪問我的REST服務。

  1. 我做的最后一件事是在web.xml中,我將Jersey從servlet更改為過濾器並開始工作

Clemens82的回答之后,在排除了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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM