2010-10-12 12 views
6

Tôi có một số lớp được hiển thị khi JAX-RS yêu cầu "trình xử lý", sử dụng chú thích javax.ws.rs.Path. Tôi muốn thêm một số hành động nhất định trước mỗi yêu cầu và sau mỗi yêu cầu. Ngoài ra, tôi cần phải tạo một trình xử lý ngoại lệ toàn cầu, ứng dụng này sẽ bắt mọi thứ được ném bởi các trình xử lý và giao thức này.Tôi có thể gói tất cả các yêu cầu JAX-RS bằng mã tùy chỉnh trước khi gửi, sau công văn và xử lý lỗi không?

Có thể đạt được điều này với tiêu chuẩn JAX-RS mà không tạo lớp tùy chỉnh được kế thừa từ com.sun.jersey.spi.container.servlet.ServletContainer (Tôi đang sử dụng Jersey).

+0

Câu trả lời được chấp nhận không đề cập đến bạn mong muốn có các hành động yêu cầu trước và sau. Bạn đã bao giờ đến một giải pháp cho điều đó chưa? –

+0

Tùy chỉnh [Bộ lọc Servlet] (http://download.oracle.com/javaee/5/api/javax/servlet/Filter.html) là cách để thực hiện. – yegor256

Trả lời

2

Bạn cũng có thể sử dụng ExceptionMappers. Cơ chế này mà bắt ném ngoại lệ bởi dịch vụ của bạn và chuyển đổi nó sang đáp ứng thích hợp:

@Provider 
public class PersistenceMapper implements ExceptionMapper<PersistenceException> { 

    @Override 
    public Response toResponse(PersistenceException arg0) { 
     if(arg0.getCause() instanceof InvalidDataException) { 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } else { 
      ... 
     } 
    } 

} 

Để biết thêm thông tin xem:

0

Bạn có thể sử dụng filters để đọc và sửa đổi tất cả các yêu cầu và phản hồi.

+0

Có vẻ như các bộ lọc chỉ có thể được sử dụng bởi khách hàng! – fjsj

1

Bạn có thể tạo dịch vụ RESTful proxy và sử dụng dịch vụ này làm điểm nhập cho tất cả các dịch vụ RESTful khác của bạn. Proxy này có thể nhận các yêu cầu, thực hiện bất kỳ việc xử lý trước nào, gọi dịch vụ RESTful cần thiết, xử lý đáp ứng và sau đó trả lại một cái gì đó cho người gọi.

Tôi đã thiết lập như thế này trong một dự án mà tôi đang thực hiện. Proxy thực hiện các chức năng như xác thực, ủy quyền và ghi nhật ký kiểm tra. Tôi có thể đi sâu vào chi tiết nếu bạn thích.

Chỉnh sửa:
Đây là ý tưởng về cách bạn có thể muốn triển khai proxy hỗ trợ các yêu cầu GET;

@Path("/proxy") 
public class Proxy 
{ 
private Logger log = Logger.getLogger(Proxy.class); 

@Context private UriInfo uriInfo; 

@GET 
@Path("/{webService}/{method}") 
public Response doProxy(@Context HttpServletRequest req, 
       @PathParam("webService") String webService, 
       @PathParam("method") String method) 
{ 
    log.debug("log request details"); 

    //implement this method to work out the URL of your end service 
    String url = constructURL(req, uriInfo, webService, method); 

    //Do any actions here before calling the end service 

    Client client = Client.create(); 
    WebResource resource = client.resource(url); 

    try 
    { 
     ClientResponse response = resource.get(ClientResponse.class); 
     int status = response.getStatus(); 
     String responseData = response.getEntity(String.class); 

     log.debug("log response details"); 

     //Do any actions here after getting the response from the end service, 
     //but before you send the response back to the caller. 

     return Response.status(status).entity(responseData).build(); 
    } 
    catch (Throwable t) 
    { 
     //Global exception handler here 
     //remember to return a Response of some kind. 
    } 
} 
+0

Âm thanh như một giải pháp, nhưng làm cách nào bạn "xử lý phản hồi"? Bạn có thể đưa ra một ví dụ về proxy RESTful này không? – yegor256

Các vấn đề liên quan