我可以使用自定义预分派,发布后和错误处理程序代码来包装所有JAX-RS请求吗?

时间:2010-10-12 15:08:27

标签: java jersey jax-rs

我使用javax.ws.rs.Path注释将许多类公开为JAX-RS请求“处理程序”。我想在每个请求之前和每个请求之后添加某些操作。此外,我需要创建一个全局应用程序范围的异常处理程序,它将捕获这些处理程序和协议抛出的所有内容。

是否可以使用标准JAX-RS实现此目的,而无需创建从com.sun.jersey.spi.container.servlet.ServletContainer继承的自定义类(我正在使用Jersey)。

3 个答案:

答案 0 :(得分:2)

您也可以使用ExceptionMappers。此机制捕获您的服务抛出的异常并将其转换为相应的Response:

@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 { 
           ... 
        } 
    }  

}  

有关详细信息,请参阅:

答案 1 :(得分:1)

您可以创建代理RESTful服务,并将其用作所有其他RESTful服务的入口点。此代理可以接收请求,进行任何预处理,调用所需的RESTful服务,处理响应,然后将某些内容返回给调用者。

我在一个我正在研究的项目中有这样的设置。代理执行身份验证,授权和审计日志记录等功能。如果你愿意,我可以进一步了解详情。

编辑:
以下是您希望如何实现支持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.
    }
}

答案 2 :(得分:0)

您可以使用filters来阅读和修改所有请求和回复。