java.lang.ClassNotFoundException: javax.ws.rs.MessageProcessingException

Je suis le déploiement d'une guerre de Tomcat 7.0.57. Ce code utilise Jersey 2.x Client de communiquer avec un point de terminaison Rest et expose ses propres Reste des points de terminaison à l'aide de CXF (AKA la guerre du point de terminaison).

Quand j'ai frappé l'un de la guerre de points de terminaison, le code semble fonctionner et renvoie une réponse sans problème à partir du point de vue du serveur, mais le client obtient une réponse 500 retourné à partir de tomcat. C'est l'erreur:

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)

Curieusement, cette erreur n'apparaît pas dans les logs du serveur tomcat.

J'ai fait une petite recherche et il semble que cette classe fait partie de jax-rs. Dans mon pom maven, je suis déjà compris cette dépendance:

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

Mais cette dépendance ne semble pas avoir cette classe. Cette classe est dans cette dépendance:

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

Je me sens mal à l'aise le retour à une version inférieure qui est une étape importante. Plus important encore, ce pot n'inclut pas les classes que j'utilise dans mon code comme javax.ws.rs.client.ClientBuilder.

Quelqu'un peut-il expliquer pourquoi je me fais de cette exception et comment résoudre ce problème?


Ma Solution

Je suis venu à la conclusion que cela a plus à voir avec le Maillot du Client et CXF interférer les unes avec les autres. J'ai décidé de retirer le Maillot du Client et de le remplacer avec de l'CXF Client. Ces instructions sont beaucoup mieux que les officiels: 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());
}
}

Très similaire de l'API. J'ai juste cherché et remplacer certains noms de méthode et tout a fonctionné.

Parce que différents, les gens regardent chaque

OriginalL'auteur Daniel Kaplan | 2015-01-09