JSON - 如何对请求和响应执行常见操作

时间:2012-10-22 14:25:45

标签: java json web-services rest jackson

代码#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);

2 个答案:

答案 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方法的参数传递。