代码#1的示例:
@POST
@Path("/foo")
@Consumes({ MediaType.APPLICATION_JSON })
public SomeClassA foo(SomeOtherClassB input, @Context HttpServletResponse response, @Context HttpServletRequest request) {
takeSomethingFromRequestAndPutOnResponseHeader(response, request);
//... do more logic actions
return x;
}
@POST
@Path("/bar")
@Consumes({ MediaType.APPLICATION_JSON })
public SomeClassC bar(SomeOtherClassD input, @Context HttpServletResponse response, @Context HttpServletRequest request) {
takeSomethingFromRequestAndPutOnResponseHeader(response, request);
//... do more logic actions
return y;
}
正如您所看到的,我们有许多不同的API方法,并且在每个API中我们都需要注入请求和响应,以便我们能够对它们执行相同的操作。 />
所以,问题是:我们怎样才能使这段代码只写一次?
*所以,我们不需要在每个方法上写上这些行
@Context HttpServletResponse response, @Context HttpServletRequest request
*所以,我们不需要每次都执行方法
takeSomethingFromRequestAndPutOnResponseHeader(response, request);
这主要是因为有人忘了这样做...
原因是我们在多个服务器上运行API,并且我们希望将响应中的服务器URL(从请求)添加到标头中,以便更轻松地调试不同的环境。
非常感谢,
URI。
我们希望拥有的是:
@POST
@Path("/foo")
@Consumes({ MediaType.APPLICATION_JSON })
public SomeClassA foo(SomeOtherClassB input) {
//... do more logic actions
return x;
}
@POST
@Path("/bar")
@Consumes({ MediaType.APPLICATION_JSON })
public SomeClassC bar(SomeOtherClassD input) {
//... do more logic actions
return y;
}
虽然这是在其他地方写的一次。
@Context HttpServletResponse response, @Context HttpServletRequest request
takeSomethingFromRequestAndPutOnResponseHeader(response, request);
答案 0 :(得分:1)
如果您希望将此功能用于所有API方法,为什么不使用http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html?
这不会注入请求和响应,但是在调用了takeSomethingFromRequestAndPutOnResponseHeader(响应,请求)后,您可能不需要它们。
答案 1 :(得分:1)
通过公开和注释HttpServletResponse / HttpServletRequest字段,可以在类级别注入HttpServletResponse和HttpServletRequest。例如:
class MyResource {
@Context
private HttpServletResponse response;
@Context
private HttpServletRequest request;
.....
//API methods below.....
}
这样您就不需要将请求和响应显式地作为API方法的参数传递。