jboss jersey jax-rs jboss7.x jersey-2.0

Jersey 2.1+JBoss 7.1 NoSuchMethodError: getProperties



jax-rs jboss7.x (3)

Estoy intentando ejecutar el servicio REST de Jersey 2.1 en JBoss 7.1 AS. Recibo el error NoSuchMethodError: javax.ws.rs.core.Application.getProperties durante la implementación:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/RESTService]] (MSC service thread 1-9) StandardWrapper.Throwable: java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map; at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:271) [jersey-server-2.1.jar:] at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:283) [jersey-container-servlet-core-2.1.jar:]

En pom.xml tengo:

<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.1</version> </dependency>

Y en el web.xml:

<servlet> <servlet-name>RESTService</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>com.gatekeeper.restservice.RESTApplication</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>

Anteriormente probé con Jersey 1.17.1 y funcionó (después de desactivar el rastreo resteasy y la extensión / subsistema jaxrs en JBoss). Hasta el momento, he encontrado una publicación similar (pero con Tomcat) en la que la conspiración era que la aplicación incorrecta javax.ws.rs.core.Application está siendo enlazada en el tiempo de ejecución, y además que la clase enlazada es una "antigua" (JAX- RS 1.1) versión.

¿Alguna ayuda sobre cómo resolver esto? Soy chico de .net y estoy totalmente ciego en java :) Gracias Bartek


Además, parece que la práctica de usar comodines dentro de la fuente Java está en desuso.

No esta)

@Path("/v1/status/*")

Pero esto)

@Path("/v1/status")

Una mejora, en mi humilde opinión.


En resumen, se han realizado cambios estructurales significativos entre 1.17 y 2.2 de la implementación de Jersey. Necesitas:

1) Extienda su clase de aplicación desde "org.glassfish.jersey.server.ResourceConfig"

2) Agregue la línea de paquetes dentro del constructor de la clase de aplicación, así:

public class MyApplication extends ResourceConfig { public MyApplication() { packages("com.mysite.MyApplication"); } }

3) Dentro de web.xml, necesitarás actualizar una cantidad de lugares. Vea abajo:

<servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>com.mysite.MyApplication</param-value> </init-param>

4) Despliega y diviértete.


Sé que este hilo no es tan fresco, pero aun así, ayer solo di con este problema y nada parece funcionar.

Mi escenario es muy similar: la aplicación REST Jersey 2.23.1 (JAX-RS 2.x) ya se ejecuta en tomcat y necesita ejecutarse en JBoss 7.1.1 (JAX-RS 1.1 incorporado).

  1. Desactive la exploración del paquete Restease en 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>

  2. Elimine todas las etiquetas con "jaxrs" de standalone.xml. De lo contrario, seguirás enfrentando LinkageError porque JBoss mantiene 1.1 espec.

  3. Cree suAplicación.war! WEB-INF / jboss-deployment-structure.xml tal como se indica aquí: https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7#ClassLoadinginAS7-JBossDeploymentStructureFile

De esta manera, no solo:

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

Desaparece, pero también, JAXB funciona bien (No ClassNotFoundException for javax.xml.bind.JAXBException una vez que el módulo javax.xml.bind.api también está activado).

Obs1 : la pregunta original es mezclar jersey 1.x con jersey 2.x. No hay PojoMappingFeature en jersey 2.x y el paquete base es org.glassfish.jersey . Eche un vistazo a https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

Obs2 : También he intentado otros enfoques, como extender ResourceConfig y escanear paquetes desde allí o registrar clases directamente. Nada funcionaba como la documentación adecuada en el ítem 3. Así que mantuve mi servlet intacto:

<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>

¡Espero que ayude a los demás!