2013-08-11 17 views
5

Sto tentando di eseguire il servizio REST di Jersey 2.1 su JBoss 7.1 AS. Mi è toccato il NoSuchMethodError: errore javax.ws.rs.core.Application.getProperties durante la distribuzione:Jersey 2.1 + JBoss 7.1 NoSuchMethodError: getProperties

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

In pom.xml ho:

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

E nel web.xml:

In precedenza ho provato con Jersey 1.17.1 e ha funzionato (dopo aver disattivato la scansione resteasy e l'estensione/sottosistema jaxrs in JBoss). Finora ho trovato un post simile (ma con Tomcat) in cui la conslusione era che il javax.ws.rs.core.Application errato veniva associato in fase di esecuzione e inoltre che la classe associata era un "vecchio" (JAX- RS 1.1) versione.

Qualsiasi aiuto su come risolvere questo problema? Io sono .net ragazzo e sono totalmente cieco in java :) Grazie Bartek

risposta

0

In breve, sono stati apportati significativi cambiamenti strutturali tra 1,17 e 2,2 dell'implementazione di Jersey. È necessario:

1) Estendere la classe di applicazione da "org.glassfish.jersey.server.ResourceConfig"

2) Aggiungere la linea di pacchetti all'interno del costruttore della classe di applicazione, in questo modo:

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

3) All'interno di web.xml, è necessario aggiornare un numero di posizioni. Vedi sotto:

<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) Distribuire e divertirsi.

-1

Inoltre, sembra che la pratica dell'utilizzo di caratteri jolly all'interno della sorgente java sia deprecata.

Non questa)

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

Ma questo)

@Path("/v1/status") 

un miglioramento, IMHO.

0

So che questo thread non è così bello, ma ancora, ho riscontrato questo problema solo ieri e niente sembra funzionare.

Il mio scenario è molto simile: Jersey 2.23.1 App REST (JAX-RS 2.x) già in esecuzione su tomcat e necessario eseguire su JBoss 7.1.1 (JAX-RS 1.1 integrato).

  1. disattivare la scansione pacchetto Restease in 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. Rimuovere tutti i tag con i "jaxrs" dal standalone.xml. Altrimenti si verificherà ancora LinkageError perché JBoss mantiene la specifica 1.1 attiva.!

  3. Crea yourApp.war WEB-INF \ jboss-distribuzione-structure.xml proprio come viene sottolineato qui: https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7#ClassLoadinginAS7-JBossDeploymentStructureFile

In questo modo, non solo:

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

Disapears, ma anche, JAXB funziona correttamente (No ClassNotFoundException for javax.xml.bind.JAXBException una volta attivato anche il modulo javax.xml.bind.api).

Obs1: la domanda iniziale è mescolare la maglia 1.x con la maglia 2.x. Non c'è PojoMappingFeature in jersey 2.x e il pacchetto base è org.glassfish.jersey. Date un'occhiata a https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

Obs2: Ho provato anche altri approcci come estendere ResourceConfig e pacchetti di scansione da lì o la registrazione direttamente classi. Nulla ha funzionato come la documentazione corretta nel punto 3. Quindi mantenuto intatto il mio 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> 

Spero che aiuti gli altri!

Problemi correlati