我有一个 @AroundInvoke REST Web 服务拦截器,我想用它来记录常见数据,例如类和方法、远程 IP 地址和响应时间。
使用 InvocationContext 获取类和方法名很简单,远程 IP 可以通过 HttpServletRequest 获得,只要被拦截的 Rest Service 在其参数列表中包含 @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 上)它总是为空......
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();
我想要一种访问 HttpServletRequest 对象的可靠方法的建议 - 甚至只是 Http Headers ...无论 REST 服务是否包含该参数。