2015-01-09 7 views
5

Ich stelle einen Krieg auf Tomcat 7.0.57 bereit. Dieser Code verwendet den Jersey 2.x-Client, um mit einem Rest-Endpunkt zu kommunizieren, und stellt seine eigenen Rest-Endpunkte mithilfe von CXF (AKA, der Endpunkt des Krieges) zur Verfügung.java.lang.ClassNotFoundException: javax.ws.rs.MessageProcessingException

Wenn ich einen der Endpunkte des Krieges getroffen habe, scheint der Code zu funktionieren und gibt eine Antwort ohne Problem aus der Serverperspektive zurück, aber der Client erhält eine 500 Antwort von tomcat zurück. Dies ist der Fehler:

java.lang.ClassNotFoundException: javax.ws.rs.MessageProcessingException 
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) 
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 
    org.apache.cxf.jaxrs.impl.ResponseBuilderImpl.build(ResponseBuilderImpl.java:69) 
    org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:137) 
    org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:86) 
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
    org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77) 
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
    org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) 
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248) 
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222) 
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153) 
    org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

Seltsamerweise wird dieser Fehler nicht im Tomcat-Protokoll angezeigt.

Ich habe ein wenig Forschung und es scheint, dass diese Klasse ein Teil von Jax-Rs ist. In meinem Maven pom, bin auch ich schon diese Abhängigkeit:

<dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0.1</version> 
    </dependency> 

Aber diese Abhängigkeit scheint nicht diese Klasse zu haben. obwohl diese Klasse ist in dieser Abhängigkeit: obwohl

<dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0-m01</version> 
    </dependency> 

ich auf eine niedrigere Version unbequem Herabstufung fühlen, die ein Meilenstein ist. Noch wichtiger ist, dass dieses Jar keine Klassen enthält, die ich in meinem Code verwende, wie javax.ws.rs.client.ClientBuilder.

Kann jemand erklären, warum ich diese Ausnahme bekomme und wie man dieses Problem löst?


Meine Abhilfe

Ich bin zu dem Schluss gekommen, dass dies mehr mit ihnen zu tun mit dem Jersey-Client und CXF zu stören. Ich entschied mich, den Jersey Client zu entfernen und durch den CXF Client zu ersetzen. Diese Anweisungen sind viel besser als die offiziellen: http://fandry.blogspot.com/2012/06/how-to-create-simple-cxf-based-jax-rs.html

import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; 
import org.apache.cxf.jaxrs.client.WebClient; 
import java.util.ArrayList; 
import java.util.List; 

public class App 
{ 
    public static void main(String[] args) throws Exception { 

    List<Object> providers = new ArrayList<Object>(); 
    providers.add(new JacksonJaxbJsonProvider()); 

    WebClient client = WebClient.create("http://localhost:8080/poc_restapi_cxf/api", providers); 
    client = client.accept("application/json").type("application/json").path("/order").query("id", "1"); 

    Order order = client.get(Order.class); 
    System.out.println("Order:" + order.getCustomerName()); 

    } 
} 

Sehr ähnliche API. Ich habe gerade einige Methodennamen gesucht und ersetzt und alles hat funktioniert.

+1

@Michael-O Weil verschiedene Leute sich jede –

Antwort

3

Ich stieß auch auf dieses Problem. Im Gegensatz zu Ihren Projektanforderungen musste ich Jersey und CXF spielen lassen.

Das ultimative Problem ist in der FactoryFinder-Klasse, die von Jersey verwendet wird, um den entsprechenden Laufzeitdelegaten (für verschiedene untergeordnete Objekte verwendet) zu erhalten - dies wiederum hat eine Klasse mit einem Import in die betroffene Klasse.

Um dies zu umgehen, benötigen Sie eine Datei in Ihrem Ressourcenordner (vorausgesetzt, diese wird in Ihren Klassenpfadordner importiert) mit dem Pfad META-INF/services/javax.ws.rs.ext.RuntimeDelegate, der den Wert enthält :

org.glassfish.jersey.internal.RuntimeDelegateImpl 

Dies sollte Ihr Problem lösen.

+0

ansehen Dies repariert es für mich. Vielen Dank. – Rusty

+0

gerettet den Tag! Wie in der Welt hast du diese Lösung gefunden? – spy

0

In folgenden Maven Abhängigkeit

<dependency> 
<groupId>javax.ws.rs</groupId> 
<artifactId>javax.ws.rs-api</artifactId> 
<version>2.0-m08</version> 
</dependency> 
+0

"Ich fühle mich nicht wohl dabei, zu einer niedrigeren Version herunterzustufen, das ist ein Meilenstein." –

+2

Diese Lösung handelte nur ein Problem für ein anderes. Anstelle der fehlenden Klasse, die vom OP erwähnt wird, fehlt mir jetzt der Fehler javax/ws/rs/NotFoundException – Blamkin86

+0

Der gleiche Fehler wurde von @Blamkin86, java.lang.ClassNotFoundException: javax.ws.rs.NotFoundException gemeldet –

-1

hatte ich ein sehr ähnliches Problem. Als ich die Ausnahme durch Hinzufügen der Abhängigkeit (javax.ws.rs) behoben habe, konnte ich dann javax.ws.rs.client.ClientBuilder nicht mehr verwenden. Ich habe die folgende Änderung vorgenommen und das Problem scheint weg zu sein.

Datei Web.xml

<servlet> 
<servlet-name>Jersey Web Application</servlet-name> 
- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
<init-param> 
- <param-name>jersey.config.server.provider.packages</param-name> 
+ <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.test.test1</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
<servlet>