Sto distribuendo una guerra a Tomcat 7.0.57. Questo codice utilizza il client Jersey 2.x per comunicare con un endpoint Rest e espone i propri endpoint Resto utilizzando CXF (AKA the war's endpoint).java.lang.ClassNotFoundException: javax.ws.rs.MessageProcessingException
Quando ho colpito uno degli endpoint della guerra, il codice sembra funzionare e restituisce una risposta senza problemi dal punto di vista del server, ma il client riceve una risposta 500 da Tomcat. Questo è l'errore:
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)
Stranamente, questo errore non viene visualizzato nel registro tomcat.
Ho fatto una piccola ricerca e sembra che questa classe sia parte di jax-rs. Nel mio esperto di pom, sto già compreso questa dipendenza:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
Ma questa dipendenza non sembra avere questa classe. Quella classe è in questa dipendenza però:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0-m01</version>
</dependency>
mi sento a disagio declassamento a una versione più bassa che è una pietra miliare però. Ancora più importante, quel jar non include le classi che sto usando nel mio codice come javax.ws.rs.client.ClientBuilder
.
Qualcuno può spiegare perché sto ricevendo questa eccezione e come risolvere questo problema?
mia soluzione
Sono venuto alla conclusione che questo ha più a che fare con il Cliente Jersey e CXF interferire con l'altro. Ho deciso di rimuovere il client Jersey e sostituirlo con il client CXF. Queste istruzioni sono molto meglio di quelli ufficiali: 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());
}
}
Molto simile API. Ho appena cercato e sostituito alcuni nomi di metodi e tutto ha funzionato.
@ Michael-O Perché diverse persone guardano ogni –