2015-01-09 19 views
5

Tôi đang triển khai một cuộc chiến với Tomcat 7.0.57. Mã này sử dụng Jersey 2.x Client để giao tiếp với điểm cuối Rest và cho thấy điểm cuối của Rest bằng cách sử dụng CXF (AKA của điểm cuối chiến tranh).java.lang.ClassNotFoundException: javax.ws.rs.MessageProcessingException

Khi tôi nhấn một trong các điểm cuối của chiến tranh, mã có vẻ hoạt động và trả về một phản hồi không có vấn đề từ góc nhìn của máy chủ, nhưng máy khách nhận được phản hồi 500 trả về từ tomcat. Đây là lỗi:

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) 

Rất tiếc, lỗi này không hiển thị trong nhật ký tomcat.

Tôi đã nghiên cứu một chút và có vẻ như lớp học này là một phần của jax-rs. Trong maven pom của tôi, tôi đã bao gồm sự phụ thuộc này:

<dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0.1</version> 
    </dependency> 

Nhưng sự phụ thuộc này dường như không có lớp này. Đó là lớp trong sự phụ thuộc này mặc dù:

<dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0-m01</version> 
    </dependency> 

tôi cảm thấy không thoải mái hạ cấp lên một phiên bản thấp hơn đó là một cột mốc quan trọng mặc dù. Quan trọng hơn, lọ đó không bao gồm các lớp tôi đang sử dụng trong mã của tôi như javax.ws.rs.client.ClientBuilder.

Bất cứ ai có thể giải thích lý do tại sao tôi nhận được ngoại lệ này và cách giải quyết vấn đề này?


My Giải pháp

Tôi đã đi đến kết luận rằng đây có nhiều việc phải làm với Client Jersey và CXF can thiệp với nhau. Tôi quyết định xóa Khách hàng Jersey và thay thế bằng Ứng dụng khách CXF. Những hướng dẫn này tốt hơn nhiều so với các hướng dẫn chính thức: 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 tương tự. Tôi chỉ tìm kiếm và thay thế một số tên phương thức và mọi thứ đã hoạt động.

+1

@ Michael-O Vì những người khác nhau xem mỗi –

Trả lời

3

Tôi cũng gặp phải vấn đề này. Không giống như bạn yêu cầu dự án có nghĩa là tôi đã có được Jersey và CXF chơi tốt đẹp.

Vấn đề cuối cùng là trong lớp FactoryFinder được sử dụng bởi Jersey để có được đại biểu thời gian chạy thích hợp (được sử dụng cho các đối tượng con khác nhau) - lần lượt có một lớp có nhập vào lớp vi phạm.

Để giải quyết vấn đề này, bạn cần có tệp trong thư mục tài nguyên của mình (giả sử thư mục này được nhập vào thư mục classpath của bạn) với đường dẫn META-INF/services/javax.ws.rs.ext.RuntimeDelegate chứa giá trị :

org.glassfish.jersey.internal.RuntimeDelegateImpl 

Điều này sẽ giải quyết được vấn đề của bạn.

+0

Điều này đã khắc phục sự cố cho tôi. Cảm ơn. – Rusty

+0

đã lưu trong ngày! bạn đã tìm ra giải pháp này thế nào? – spy

0

Add sau Maven phụ thuộc

<dependency> 
<groupId>javax.ws.rs</groupId> 
<artifactId>javax.ws.rs-api</artifactId> 
<version>2.0-m08</version> 
</dependency> 
+0

"Tôi cảm thấy không thoải mái khi hạ cấp xuống phiên bản thấp hơn, đó là một mốc quan trọng." –

+2

Giải pháp này chỉ giao dịch một vấn đề cho người khác. Thay vì lớp bị thiếu được đề cập bởi OP, tôi hiện đang thiếu javax/ws/rs/NotFoundException – Blamkin86

+0

Có cùng lỗi được báo cáo bởi @ Blamkin86, java.lang.ClassNotFoundException: javax.ws.rs.NotFoundException –

-1

Tôi đã có một vấn đề rất giống nhau. Khi tôi sửa lỗi ngoại lệ bằng cách thêm phụ thuộc (javax.ws.rs), sau đó tôi không thể sử dụng javax.ws.rs.client.ClientBuilder. Tôi đã thực hiện thay đổi sau và vấn đề dường như đã biến mất.

trang web tệp.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> 
Các vấn đề liên quan