gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:56 24 4
gpt4 key购买 nike

我正在向 Tomcat 7.0.57 部署 war 。此代码使用 Jersey 2.x Client 与 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 Client 和 CXF 相互干扰有关。我决定删除 Jersey Client 并将其替换为 CXF Client。这些说明比官方的要好得多: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。我只是搜索并替换了一些方法名称,一切正常。

最佳答案

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

最终的问题在于 FactoryFinder 类,它被 Jersey 用来获取适当的运行时委托(delegate)(用于各种附属对象)——这反过来又具有一个导入到有问题的类的类。

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

org.glassfish.jersey.internal.RuntimeDelegateImpl

这应该可以解决您的问题。

关于java.lang.ClassNotFoundException : javax. ws.rs.MessageProcessingException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com