0

代码 #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(来自请求)添加到响应头中,以便于不同环境的调试。

非常感谢,
乌里。

我们想要的是:

@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);
4

2 回答 2

1

如果您希望所有 API 方法都使用此功能,为什么不使用http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html呢?

这不会注入请求和响应,但是在调用 takeSomethingFromRequestAndPutOnResponseHeader(response, request) 之后,您可能不需要它们。

于 2012-10-22T16:45:20.863 回答
1

通过公开和注释 HttpServletResponse/HttpServletRequest 字段,您可以在类级别注入 HttpServletResponse 和 HttpServletRequest。例如:

class MyResource {
@Context 
private HttpServletResponse response;
@Context
private HttpServletRequest request;
.....
//API methods below.....

}

这样您就不需要将请求和响应作为参数显式传递给您的 API 方法。

于 2012-10-22T17:16:16.083 回答