クラスとメソッド、リモート IP アドレス、応答時間などの一般的なデータをログに記録するために使用したい @AroundInvoke REST Web サービス インターセプターがあります。
クラスとメソッド名の取得は InvocationContext を使用して簡単に行うことができ、リモート IP は HttpServletRequest を介して利用できます (傍受される REST サービスのパラメーター リストに @Context HttpServletRequest が含まれている場合)。
ただし、一部の REST メソッドにはパラメーターに HttpServletRequest が含まれていないため、これらの場合に HttpServletRequest オブジェクトを取得する方法がわかりません。
たとえば、次の REST Web サービスには @Context HttpServletRequest パラメーターがありません。
@Inject
@Default
private MemberManager memberManager;
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Member add(NewMember member) throws MemberInvalidException {
return memberManager.add(member);
}
インターセプターに直接注入しようとしましたが、(JBoss 6.1 では) 常に null です...
public class RestLoggedInterceptorImpl implements Serializable {
@Context
HttpServletRequest req;
@AroundInvoke
public Object aroundInvoke(InvocationContext ic) throws Exception {
logger.info(req.getRemoteAddr()); // <- this throws NPE as req is always null
...
return ic.proceed();
REST サービスにパラメーターが含まれているかどうかに関係なく、HttpServletRequest オブジェクトにアクセスするための信頼できる方法、または単に Http ヘッダーにアクセスするためのアドバイスが必要です。