如何将 Grizzly Request 注入 Jersey ContainerRequestFilter
How to inject Grizzly Request into Jersey ContainerRequestFilter
我有 Grizzly 提供的球衣。
我有一个 ContainerRequestFilter
实现 class。但是,此 class 会为所有传入请求创建一次。因此这样做:
public class EndpointRequestFilter implements ContainerRequestFilter {
@Context
private org.glassfish.grizzly.http.server.Request requestContext;
public void filter( ContainerRequestContext req ) throws IOException {
// remove for sake of example
}
}
requestContext
为空。我可以将上下文注入到被调用的实际端点中,但这相当粗糙和丑陋,对我来说真的没有用;因为我想记录各种请求。理想情况下,希望在请求的 ResponseFilter 端获取此 Request
对象。
一定有一种简单的方法可以做到这一点。到目前为止,我所看到的所有 questions/answers 都不适用于 Grizzly 或注入到 REST 端点调用的方法中。我不想绕过我所有的数百种方法,只是因为我想获取 IP 地址而在调用中添加它!
那么这里的关键是什么?我错过了什么?
我很惊讶你竟然得到了应用程序 运行ning,以至于你发现请求为空。每当我尝试 运行 它时,我都会在启动时遇到异常,说没有请求范围,因此无法注入请求,这是我所期望的。虽然我无法重现 NPE,但我认为这个解决方案仍然可以解决您的问题。
所以 Request
是一个请求范围的对象,因为它会根据每个请求而变化。但过滤器本质上是一个单例。所以你需要做的是懒惰地检索它。为此,我们可以使用 javax.inject.Provider
作为惰性检索机制。
回到我第一段的重点,这是我在启动时遇到的异常
java.lang.IllegalStateException: Not inside a request scope.
这是有道理的,因为 Request
需要与请求范围相关联,并且在启动时有 none。请求范围仅在请求期间存在。
那么使用 Provider
的作用是允许我们在存在请求范围时尝试获取 Request
。
public static class Filter implements ContainerRequestFilter {
@Context
private javax.inject.Provider<Request> requestProvider;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
final Request request = requestProvider.get();
System.out.println(request.getRemoteAddr());
}
}
我已经测试过了,它按预期工作。
另请参阅:
我有 Grizzly 提供的球衣。
我有一个 ContainerRequestFilter
实现 class。但是,此 class 会为所有传入请求创建一次。因此这样做:
public class EndpointRequestFilter implements ContainerRequestFilter {
@Context
private org.glassfish.grizzly.http.server.Request requestContext;
public void filter( ContainerRequestContext req ) throws IOException {
// remove for sake of example
}
}
requestContext
为空。我可以将上下文注入到被调用的实际端点中,但这相当粗糙和丑陋,对我来说真的没有用;因为我想记录各种请求。理想情况下,希望在请求的 ResponseFilter 端获取此 Request
对象。
一定有一种简单的方法可以做到这一点。到目前为止,我所看到的所有 questions/answers 都不适用于 Grizzly 或注入到 REST 端点调用的方法中。我不想绕过我所有的数百种方法,只是因为我想获取 IP 地址而在调用中添加它!
那么这里的关键是什么?我错过了什么?
我很惊讶你竟然得到了应用程序 运行ning,以至于你发现请求为空。每当我尝试 运行 它时,我都会在启动时遇到异常,说没有请求范围,因此无法注入请求,这是我所期望的。虽然我无法重现 NPE,但我认为这个解决方案仍然可以解决您的问题。
所以 Request
是一个请求范围的对象,因为它会根据每个请求而变化。但过滤器本质上是一个单例。所以你需要做的是懒惰地检索它。为此,我们可以使用 javax.inject.Provider
作为惰性检索机制。
回到我第一段的重点,这是我在启动时遇到的异常
java.lang.IllegalStateException: Not inside a request scope.
这是有道理的,因为 Request
需要与请求范围相关联,并且在启动时有 none。请求范围仅在请求期间存在。
那么使用 Provider
的作用是允许我们在存在请求范围时尝试获取 Request
。
public static class Filter implements ContainerRequestFilter {
@Context
private javax.inject.Provider<Request> requestProvider;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
final Request request = requestProvider.get();
System.out.println(request.getRemoteAddr());
}
}
我已经测试过了,它按预期工作。
另请参阅: