Java RESTfull WebService: implementación de JAX-RS con bibliotecas Jersey 2.3.1


Estoy tratando de ejecutar una aplicación simple "Hallo World" Jersey 2.3.1 REST service en JBoss jboss-eap-6.1 AS. En la web.xml he deshabilitado la biblioteca RESTEasy. Durante la implementación recibo el error:

JBWEB000289: Servlet com.sol.Jersey.muestras.helloworld.recurso.MiAplicación lanzó la carga() excepción: java.lang.NoSuchMethodError: javax.ws.rs.core. Application. GetProperties()Ljava/util/Map;

En POM pongo estas dependencias:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

Esto es mi web.xml con etiquetas RESTEasy desactivación:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.sun.jersey.samples.helloworld.resources.MyApplication</param-value>
        </init-param>
           <load-on-startup>1</load-on-startup>
    </servlet>
    <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>
    <servlet-mapping>
        <servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Y mi clase java de configuración de recursos:

package com.sun.jersey.samples.helloworld.resources;
import org.glassfish.jersey.server.ResourceConfig;
public class MyApplication extends  ResourceConfig {   

     public MyApplication() {
            packages("com.sun.jersey.samples.helloworld.resources");
          //super(HelloWorldResource.class);

     }
}

Alguien tiene alguna idea para solucionarlo? gracias de antemano, Roberto

Author: Joshua Taylor, 2013-10-07

5 answers

NoSuchMethodError normalmente significa que tienes dos versiones diferentes de la clase en tu classpath. Como la clase javax.ws.rs.core.Application tiene el método getProperties() en su versión JAX-RS 2, pero no en JAX-RS 1.x, supongo que de alguna manera estás combinando el viejo 1.x Jersey (o antigua api REST) con la actual (2.3.1).

También el paquete en el que está trabajando (com.sun.jersey - el paquete 'antiguo' Jersey) apunta un poco hacia esta dirección (aunque simplemente colocar su código en ese paquete no puede causar el problema mencionado), obviamente comenzaste con el Jersey 1.x ejemplo como base (también hay muestras en Jersey 2, ver helloworld-webapp en Jersey GitHub).

Es posible que RESTEasy (que también contiene definitivamente la clase javax.ws.rs.core.Application) no esté completamente desactivado y de alguna manera por defecto a JAX-RS 1.x versión?

Comenzaría con la inspección de su archivo pom, mirar el pom efectivo (si su descriptor de proyecto tiene algún padre) y comprobar cuidadosamente lo que es en su trayectoria de clase-creo que hay un 1.x version of javax.ws.rs-api somewhere. También trate de limpiar todo el material compilado y reconstruir desde cero.

Hablando de dependencias, si su lista es exhaustiva (con respecto a Jersey), lo más probable es que tenga que agregar jersey-common (2.3.1) dependencia, ya que durante la inicialización, el método ResourceConfig.packages() llama al constructor PackageScanner, que contiene llamada a ReflectionHelper - y esto ya no es parte del jar del servidor.

Espero que esto ayude.

 48
Author: AdamL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-09 08:44:54

Me enfrenté al mismo problema recientemente. Pensé en compartir mis pasos. Como dicen las otras respuestas, el problema se debe principalmente a que tiene dos versiones diferentes de la misma clase en su classpath. Así que cuando añadas dependencias maven en tu pom ten cuidado.

Este tipo de problemas normalmente se llaman Jar Hell . Usted puede utilizar jhades API para investigar las clases se superponen entre sí. Aquí están los sencillos pasos que he seguido.

Añadir jhades dependencia en su pom.

<dependency>
    <groupId>org.jhades</groupId>
    <artifactId>jhades</artifactId>
    <version>1.0.4</version>
</dependency>

Mostrar el informe

Llame a new JHades().overlappingJarsReport(); en su método main, mostrará la salida stdout.

Muestra de salida:

file:/Users/justin/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar overlaps with
file:/Users/justin/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0/javax.ws.rs-api-2.0.jar - total overlapping classes: 55 - same classloader ! This is an ERROR!

Elimina una de las dependencias de overlap maven en tu pom.

También puedes usar otro enfoque como las exclusiones de dependencias de maven.

Fuente: Entrada de blog en jhades

Espero que esto ayude a alguien:)

 19
Author: gihan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-18 18:43:25

Acabo de tener esto trabajando en JBoss EAP 6.1.1 - Jersey 2.3.1.

Las cosas habituales no parecen funcionar / no son suficientes por sí solas:

  • deshabilitar el subsistema jaxrs en independiente.xml/dominio.xml
  • o, excluyendo los módulos jax-rs en jboss-deployment-structure.xml

Además, es necesario desactivar completamente la carga de la API jax-rs 1.1 modificando el módulo.xml en jboss-eap-6.1/modules / system / layers/base/javax/ws/rs/api/main / module.xml como esto:

<module xmlns="urn:jboss:module:1.1" name="javax.ws.rs.api">
<resources>
    <!-- Disable the next line -->
    <!-- resource-root path="jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar"/ -->
    <!-- Insert resources here -->
</resources>

<dependencies>
    <module name="org.jboss.resteasy.resteasy-jaxrs" services="export"/>
</dependencies>
</module>

Tenga en cuenta que esto deshabilitará la implementación jax-rs de JBoss (RESTEasy) para todas las demás aplicaciones también (al igual que deshabilita el subsistema jaxrs en standalone/domain.XML).

 12
Author: Jan Snelders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-16 13:30:10

Este es un problema de conflicto de versión de Jersey. Yo tenía el mismo problema. Así es como se resuelve:

  1. Vea sus dependencias de paquetes "mvn dependency: tree"

  2. Si hay una dependencia de biblioteca que depende de una versión antigua de Jersey, puede agregar una sección de exclusiones en la etiqueta de dependencia para esa biblioteca en pom.xml

 4
Author: Hajar Homayouni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-24 20:41:22

Con mvn dependencia:árbol (gracias por la sugerencia anterior, me fue capaz de identificar que el culpable (en mi caso) fue: javax.ws.rs:jsr311-api:1.1 Eliminar esta dependencia resolvió mi problema.

 0
Author: David Loy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-27 20:24:39