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 にリクエストとレスポンスを注入して、それらに対して同じアクションを実行できるようにする必要があります。

では、問題は、このコードを 1 回だけ記述するにはどうすればよいかということです。
* したがって、各メソッドに次の行を記述する必要はありません * したがって、メソッドを実行するたびに実行する必要はありません
@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

HttpServletResponse/HttpServletRequest フィールドを公開して注釈を付けることにより、クラス レベルで HttpServletResponse および HttpServletRequest を注入できます。例えば:

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

}

この方法では、リクエストとレスポンスを引数として API メソッドに明示的に渡す必要はありません。

于 2012-10-22T17:16:16.083 に答える
1

If you want this for all your API methods, why not use a http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html ?

This won't inject the request and response, but maybe you don't need them after takeSomethingFromRequestAndPutOnResponseHeader(response, request) has been called.

于 2012-10-22T16:45:20.863 に答える