2015-06-03 15 views
7

Tôi có một khách hàng đơn giản sử dụng RESTEasy như sau:RESTEasy Khách hàng Exception Handling

public class Test { 
    public static void main(String[] args) { 
     ResteasyClient client = new ResteasyClientBuilder().build(); 
     ResteasyWebTarget target = client.target("http://localhost"); 
     client.register(new MyMapper()); 
     MyProxy proxy = target.proxy(MyProxy.class); 
     String r = proxy.getTest(); 
    } 
} 

public interface MyProxy { 
    @GET 
    @Path("test") 
    String getTest(); 
} 

@Provider 
public class MyMapper implements ClientExceptionMapper<BadRequestException>{ 

    @Override 
    public RuntimeException toException(BadRequestException arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("mapped a bad request exception"); 
     return null; 
    } 

} 

Các máy chủ được cấu hình để trả lại một 400 - Bad Request trên http://localhost/test cùng với một thông điệp hữu ích. A BadRequestException đang được ném bởi ClientProxy. Khác với gói trong try/catch, làm cách nào tôi có thể thực hiện getTest() bắt ngoại lệ và trả lại thông báo hữu ích của Trả lời dưới dạng chuỗi. Tôi đã thử nhiều triển khai ClientExceptionMapper khác nhau, nhưng dường như có thể làm cho nó đúng. Mã trên không bao giờ gọi toException. Tôi đang thiếu gì ở đây?

Công việc hiện tại của tôi xung quanh là sử dụng ClientResponseFilter và sau đó thực hiện setStatus(200) và đặt nội dung gốc vào thực thể phản hồi. Bằng cách này tôi tránh các ngoại lệ ném.

+0

Bạn có thể giải thích ý của mình bằng "Máy chủ được định cấu hình trả về yêu cầu 400 - không hợp lệ" không? Suy nghĩ của tôi là việc thực hiện 'MyProxy.getTest()' thực sự nên ném một ngoại lệ có chứa một thông báo hữu ích. Sau đó, bạn sẽ sử dụng một ExceptionMapper để ánh xạ ngoại lệ đó tới một phản hồi 400 - Bad Request (và bạn có thể bao gồm thông điệp như là phần thân của phản hồi). – FGreg

+1

Đọc câu đầu tiên của câu hỏi của tôi. Tôi đang viết một khách hàng chứ không phải máy chủ. – gogators

Trả lời

-1

Tôi khuyên bạn nên đi qua API ứng dụng khách Jax-RS trừ khi có chức năng bạn cần bằng cách sử dụng ứng dụng khách RestEasy. (Tàu RestEasy với Jax-RS, do đó không có sự khác biệt về thư viện)

Client client = ClientFactory.newClient(); 
WebTarget target = client.target("http://localhost/test"); 
Response response = target.request().get(); 
if (response.getStatusCode() != Response.Status.OK.getStatusCode()) { 
    System.out.println(response.readEntity(String.class)); 
    return null; 
} 
String value = response.readEntity(String.class); 
response.close(); 

Lý do tại sao người vẽ bản đồ của bạn không hoạt động là vì khách hàng không thực sự ném ngoại lệ. Máy khách đang trả lại kết quả hợp lệ cho proxy và proxy đang đọc và loại trừ ngoại lệ, điều này xảy ra sau khi người lập bản đồ có thể chặn nó.

+0

Điều này không phải là tất cả những lợi ích của việc sử dụng proxy mặc dù (ví dụ/thử nghiệm được mã hóa cứng trong ví dụ trên)? Tôi đã đọc câu hỏi làm cách nào để proxy có thể ném một ngoại lệ hữu ích hơn. Thật lạ lùng với tôi rằng proxy đang trả lại một ngoại lệ với một thông điệp được mã hóa cứng là "yêu cầu xấu" khi thông điệp thực sự nằm trong phản hồi. Có một kẻ đánh chặn để quấn quanh xử lý ngoại lệ của proxy không? –