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.
@Michael-O Weil verschiedene Leute sich jede –