有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。我只是搜索并替换了一些方法名,一切正常


共 (3) 个答案

  1. # 1 楼答案

    我也遇到了这个问题。与您不同,项目要求意味着我必须让Jersey和CXF发挥出色

    最终的问题在于Jersey使用的FactoryFinder类,该类用于获取适当的运行时委托(用于各种辅助对象)——这反过来又有一个类,该类具有对违规类的导入

    要解决这个问题,您需要在资源文件夹中有一个路径为META-INF/services/javax的文件(假定该文件已导入到您的classpath文件夹)。ws。包含以下值的rs.ext.RuntimeDelegate:

    org.glassfish.jersey.internal.RuntimeDelegateImpl
    

    这应该能解决你的问题

  2. # 2 楼答案

    添加以下Maven依赖项

    <dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0-m08</version>
    </dependency>  
    
  3. # 3 楼答案

    我有一个非常类似的问题。当我通过添加依赖项(javax.ws.rs)修复异常时,我当时无法使用javax。ws。客户。客户端生成器。我做了以下更改,问题似乎消失了

    文件网站。xml

    <servlet>
     <servlet-name>Jersey Web Application</servlet-name>
     - <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     + <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
     <init-param>
     - <param-name>jersey.config.server.provider.packages</param-name>
     + <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.test1</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
    <servlet>