Despliegue de una aplicación web de Jersey en Jboss AS 7
migration jboss7.x (11)
Actualmente ejecuto algunas aplicaciones web en Jboss AS 4/5 y estoy probando la migración a jboss7. Cuando trato de implementar una aplicación basada en jersey en JBoss AS 7 (perfil completo con archivo de configuración de vista previa independiente), obtengo:
org.jboss.as.server.deployment.DeploymentUnitProcessingException: Only one JAX-RS Application Class allowed.
Hice un poco de búsqueda y descubrí que RestEasy es la implementación predeterminada de JAX-RS integrada en Application Server. Publicaciones como http://community.jboss.org/message/579996 y https://issues.jboss.org/browse/JBAS-8830 ) mencionan que el implementador de RestEasy se hace cargo.
En AS 6, parece más fácil eliminar el implementador, mientras que no he visto ninguna solución para AS 7.
¿Podemos actualizar el enfoque "servidor-agnóstico" para incluir JBoss 7.1.1 y Servlet 3.0?
<context-param>
no es válido en una versión 3.0 web-xml.
Además de eliminar todo el subsistema jaxrs en standalone.xml
como se menciona en las otras publicaciones, excluyendo los módulos RESTEasy en jboss-deployment-structure.xml
también puede funcionar.
<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>
También echa un vistazo
Creo que el enfoque correcto es utilizar una aplicación de aplicación JAX-RS independiente del servidor de aplicaciones. No hay necesidad de meterse con ninguna configuración de JBoss. Todo lo que necesita es extender la aplicación javax.ws.rs.core.Application en su aplicación web JAX-RS. Puedes encontrar un ejemplo here . Luego, debes poner esto en tu 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>
El mecanismo de escaneo de paquetes no funciona correctamente en JBoss 7.x. He probado este enfoque con éxito en JBoss 7.0.2.Final y JBoss 7.1.1.Final.
Debe excluir que el subsistema jaxrs se active para su implementación, agregar esto a 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>
o puede ir a standalone.xml y eliminar el subsistema allí. Para hacerlo, debes eliminar
<subsystem xmlns="urn:jboss:domain:jaxrs:1.0">
...
...
<subsystem>
parte de la configuración, la parte de extensión de la parte superior puede evitar que duela en ambos sentidos. o puede conectarse al servidor con CLI y ejecutar
/subsystem=webservices:remove()
Solo una nota, funcionalidad exclude-subsystems y deployment-strucure: 1.2 se agregó en 7.1.2 y, como tal, no funcionará en 7.1.1.
Esto es lo que funcionó para mí para JBoss 7.1.1 y Jersey 1.17.1. No es necesario modificar standalone.xml
o domain.xml
. Además de filtrar restEasy en web.xml, indica a Jersey que use Jackson. Puede leer sobre esta configuración here .
Para ahorrar tiempo en las conjeturas de configuración, estoy publicando web.xml
y pom.xml
desde el proyecto de prueba.
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>
Logré ejecutar Jersey WS en mi JBOSS AS7.
Lo que hago para JBOSS es simplemente eliminar todo lo relacionado con jax-rs en standalone.xml
El código de muestra de mi jersey se obtuvo de: http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/
Lo único que hago por la camiseta es eliminar el init-param de web.xml y copiar jersey lib en 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>-->
Opción Ahother:
- Edita autónoma / configuration / standalone.xml y comenta todas las entradas jaxrs. Esto configurará Jersey en lugar de RESTEasy.
- Elimine jboss-web.xml de WEB-INF / web.xml. Este archivo ya no funciona con JBoss 7
Edite web.xml, agregue un init-param com.sun.jersey.config.property.packages configurado para el paquete de su recurso, como:
<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
Puede superar esto en la configuración independiente modificando configuration / standalone.xml y eliminando referencias a jaxrs en las extensiones y la sección de perfil. Tenga en cuenta que, aunque comenté esas partes en mi standalone.xml, JBoss automáticamente eliminará esas referencias en el siguiente inicio ...
ya se ha mencionado en esta publicación: https://community.jboss.org/message/744530#744530 , puede solicitar al módulo resteasy que no busque otras implementaciones de JAX RS en su aplicación web; solo agregue esto a su 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>
funcionó bien para mí
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<exclude-subsystems>
<subsystem name="jaxrs" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
Hará el truco, funciona muy bien con 7.3AS.ctomc acaba de perder una pequeña barra al final para terminar la sección. :-)
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.