TomcatJava。lang.ClassNotFoundException:javax。ws。rs.MessageProcessingException
我正在向Tomcat 7.0.57部署一场战争。此代码使用Jersey 2。x客户端与Rest端点通信,并使用CXF(也称为war端点)公开其自己的Rest端点
当我访问war的一个端点时,代码似乎正常工作,从服务器的角度返回一个没有问题的响应,但是客户端从tomcat返回了500个响应。这就是错误:
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)
奇怪的是,这个错误没有出现在tomcat日志中
我做了一些研究,似乎这个类是jax-rs的一部分。在我的maven pom中,我已经包含了这个依赖项:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
但是这个依赖项似乎没有这个类。该类在此依赖项中是,但:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0-m01</version>
</dependency>
我觉得降级到较低的版本很不舒服,但这是一个里程碑。更重要的是,这个jar不包括我在代码中使用的类,比如javax.ws.rs.client.ClientBuilder
有人能解释我为什么会遇到这个异常以及如何解决这个问题吗
我的变通方法
我得出的结论是,这与Jersey客户机和CXF相互干扰有关。我决定删除Jersey客户端并用CXF客户端替换它。这些指令比官方指令要好得多: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());
}
}
非常相似的API。我只是搜索并替换了一些方法名,一切正常
# 1 楼答案
我也遇到了这个问题。与您不同,项目要求意味着我必须让Jersey和CXF发挥出色
最终的问题在于Jersey使用的FactoryFinder类,该类用于获取适当的运行时委托(用于各种辅助对象)——这反过来又有一个类,该类具有对违规类的导入
要解决这个问题,您需要在资源文件夹中有一个路径为META-INF/services/javax的文件(假定该文件已导入到您的classpath文件夹)。ws。包含以下值的rs.ext.RuntimeDelegate:
这应该能解决你的问题
# 2 楼答案
添加以下Maven依赖项
# 3 楼答案
我有一个非常类似的问题。当我通过添加依赖项(javax.ws.rs)修复异常时,我当时无法使用javax。ws。客户。客户端生成器。我做了以下更改,问题似乎消失了
文件网站。xml