我使用javax.ws.rs.Path
注释将许多类公开为JAX-RS请求“处理程序”。我想在每个请求之前和每个请求之后添加某些操作。此外,我需要创建一个全局应用程序范围的异常处理程序,它将捕获这些处理程序和协议抛出的所有内容。
是否可以使用标准JAX-RS实现此目的,而无需创建从com.sun.jersey.spi.container.servlet.ServletContainer
继承的自定义类(我正在使用Jersey)。
答案 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来阅读和修改所有请求和回复。