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é.
OriginalL'auteur Daniel Kaplan | 2015-01-09
Vous devez vous connecter pour publier un commentaire.
Je suis tombé sur cette question. Contrairement à vous les exigences du projet signifiait que je devais obtenir le Jersey et CXF jouer gentil.
L'ultime problème est dans le FactoryFinder classe qui est utilisée par de Jersey à l'exécution délégué (utilisé pour divers filiale d'objets) - à son tour, a une classe avec une importation de la classe incriminée.
Pour contourner ce problème, vous devez avoir un fichier dans votre dossier de ressources (en supposant ce sont importés dans votre classpath dossier) avec le chemin META-INF/services/javax.ws.rs.ext.RuntimeDelegate qui contient la valeur:
Cela devrait résoudre votre problème.
sauvé la journée! comment avez-vous trouver cette solution?
OriginalL'auteur Sam Keays
Ajouter la suite Maven dependency
Cette solution simplement échangé un problème à un autre. Au lieu de la classe manquants mentionné par l'OP, je suis aujourd'hui disparu javax/ws/rs/NotFoundException
Eu la même erreur signalée par @Blamkin86 , java.lang.ClassNotFoundException: javax.ws.rs.NotFoundException
OriginalL'auteur Jay
J'ai eu un problème similaire. Quand je fixe l'exception de l'ajout de la dépendance (javax.ws.rs), j'ai ensuite été dans l'impossibilité d'utiliser javax.ws.rs.client.ClientBuilder. J'ai apporté la modification suivante et le problème semble avoir disparu.
fichier web.xml
OriginalL'auteur MPeli