Tomcat 7.0.57에 war를 배포하고 있습니다. 이 코드는 Jersey 2.x Client를 사용하여 Rest 엔드 포인트와 통신하고 CXF (일명 엔드 포인트)를 사용하여 자체 Rest 엔드 포인트를 표시합니다.java.lang.ClassNotFoundException : javax.ws.rs.MessageProcessingException
전쟁의 끝점 중 하나에 충돌했을 때 코드는 작동하는 것처럼 보이고 서버의 관점에서 문제없이 응답을 반환하지만 클라이언트는 500 개의 응답을 Tomcat에서 반환합니다. 이것은 오류입니다 :
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의 일부인 것처럼 보입니다.
<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>
내가 비록 이정표 낮은 버전에 불편 다운 그레이드를 느낀다. 더 중요한 것은, 해당 항아리에는 javax.ws.rs.client.ClientBuilder
과 같은 코드에서 사용하는 클래스가 포함되지 않는다는 것입니다.
아무도 왜이 예외가 발생하는지 그리고이 문제를 해결하는 방법을 설명 할 수 있습니까?
내 해결
나는이 저지 클라이언트와 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. 방금 몇 가지 메소드 이름을 검색하고 바꿨고 모든 것이 작동했습니다.
@ Michael-O 각기 다른 사람들이 각기 다르기 때문에 –