![](/img/trans.png)
[英]deploying a Jersey JAX-RS WAR to JBoss: ResourceConfig is not proxyable
[英]Deploying a Jersey webapp on Jboss AS 7
當前正在Jboss AS 4/5上運行一些webapp,我正在測試向jboss7的遷移。 當我嘗試在JBoss AS 7(帶有獨立預覽配置文件的完整配置文件)上部署基於球衣的Web應用程序時,我得到:
org.jboss.as.server.deployment.DeploymentUnitProcessingException: Only one JAX-RS Application Class allowed.
我已經做了一些探索,發現RestEasy是嵌入到Application Server中的默認JAX-RS實現。 像http://community.jboss.org/message/579996和https://issues.jboss.org/browse/JBAS-8830這樣的帖子都提到了RestEasy部署程序接管了這一工作。
在AS 6中,刪除部署程序似乎更容易,而我還沒有看到AS 7的任何解決方案。
這篇文章已經提到了它: https ://community.jboss.org/message/744530#744530,您可以要求resteasy模塊不要掃描您的webapp中的其他JAX RS實現; 只需將其添加到您的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>
對我來說很好
除了刪除其他站點中提到的standalone.xml
的整個jaxrs子系統以外, jboss-deployment-structure.xml
的RESTEasy模塊也可能起作用。
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<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>
還簽出
我相信正確的方法是使用與應用程序服務器無關的JAX-RS應用程序部署。 無需弄亂任何JBoss配置。 您所需要的只是在JAX-RS Web應用程序中擴展javax.ws.rs.core.Application 。 您可以在此處找到示例。 然后,您需要將其放入web.xml中。
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>jersey.MyApplication</param-value>
</init-param>
<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>
<load-on-startup>1</load-on-startup>
</servlet>
軟件包掃描機制在JBoss 7.x上無法正常工作。 我已經在JBoss 7.0.2.Final和JBoss 7.1.1.Final中成功測試了這種方法。
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<exclude-subsystems>
<subsystem name="jaxrs" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
可以做到這一點,可以在7.3AS上很好地工作。ctomc只是在結尾處錯過了一個小斜線以終止該部分。:-)
In web.xml file add the files
<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>
and comment out the init-param
<!-- <init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value></param-value>
</init-param> -->
This worked out for me in jboss-as-7.1.1.Final and i did not do any changes in standalone.xml.
另一個選項:
編輯web.xml,將配置為init.param com.sun.jersey.config.property.packages添加到資源包中,例如:
<init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>org.foo</param-value> </init-param>
https://github.com/Atmosphere/atmosphere/wiki/Deploying-Atmosphere-Jersey-in-JBoss-7.1.x
我設法在我的JBOSS AS7上運行Jersey WS。
我為JBOSS所做的只是刪除了standalone.xml中與jax-rs相關的所有內容
我的球衣示例代碼來自: http : //www.ibm.com/developerworks/web/library/wa-aj-tomcat/
我對球衣的唯一操作是從web.xml中刪除init-param並將球衣庫復制到WebContent / WEB-INF / lib。
<!--<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>sample.hello.resources</param-value>
</init-param>-->
我們是否可以更新“與服務器無關”的方法以包含JBoss 7.1.1和Servlet 3.0?
<context-param>
在3.0版Web-xml中無效。
這是適用於JBoss 7.1.1和Jersey 1.17.1的內容。 無需修改standalone.xml
或domain.xml
。 除了過濾web.xml中的restEasy之外,它還指示Jersey使用Jackson。 您可以在此處閱讀有關此配置的信息 。
為了節省配置猜測的時間,我從測試項目中發布了web.xml
和pom.xml
。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>TestJerseyonJBoss</display-name>
<servlet>
<servlet-name>Jersey REST Service</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.test.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<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-app>
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>TestJerseyOnJBoss</groupId>
<artifactId>TestJerseyOnJBoss</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
您應該在部署中不激活jaxrs子系統,然后將其添加到META-INF / jboss-deployment-structure.xml中
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<exclude-subsystems>
<subsystem name="jaxrs" />
</exclude-subsystems>
<deployment>
</jboss-deployment-structure>
或者,您可以轉到standalone.xml並在那里刪除子系統。 為此,您需要刪除
<subsystem xmlns="urn:jboss:domain:jaxrs:1.0">
...
...
<subsystem>
配置的一部分,頂部的擴展部分可以保持不變。 或者您可以使用CLI連接到服務器並運行
/subsystem=webservices:remove()
請注意,在7.1.2中添加了“排除子系統功能”和“部署結構:1.2”,因此在7.1.1上不起作用。
您可以通過修改configuration / standalone.xml並在擴展和概要文件部分中刪除對jaxrs的引用來在獨立配置中克服此問題。 注意,即使我在standalone.xml中注釋掉了這些部分,JBoss也會在下次啟動時自動刪除這些引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.