Jersey容器请求过滤器(Dropwizard)中的@Context注入不起作用

4

@Context注入可以用于类,但不能用于对象。

在ContainerRequestFilter中使用HttpServletRequest会产生null指针。

Dropwizard版本:-1.1.0

ContainerRequestFilter

public class ApplicationIPAuthFilter implements ContainerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationIPAuthFilter.class); private HerculesRestAccessor restAccessor; private String applicationName;
@Context private HttpServletRequest httpServletRequest;
public ApplicationIPAuthFilter(){ }
public ApplicationIPAuthFilter(HerculesRestAccessor accessor, String applicationName) { restAccessor = accessor; this.applicationName = applicationName; }
@Override public void filter(ContainerRequestContext requestContext) throws IOException { // 需要远程Ip String remoteIp = this.httpServletRequest.getRemoteAddr(); .... } }

DynamicFeature

@Provider
public class ApplicationIPAuthFeature implements DynamicFeature {
private final HerculesRestAccessor accessor; private final String applicationName;
public ApplicationIPAuthFeature(HerculesRestAccessor accessor, String applicationName) {
this.accessor = accessor; this.applicationName = applicationName; }
@Override public void configure(ResourceInfo resourceInfo, FeatureContext context) { if (resourceInfo.getResourceMethod().getAnnotation(ApplicationIPAuthRequired.class) != null) {
// 不起作用 context.register(new ApplicationIPAuthFilter(accessor, applicationName));
//@Context注入在ContainerRequestFilter中对于类是有效的 //context.register(ApplicationIPAuthFilter.class); } } }

我想在ContainerRequestFilter中获取远程Ip,以基于Ip进行身份验证。

如何解决这个问题.. 需要帮助吗?

1个回答

4

动态特性存在已知问题。当注册为对象时,注入不起作用。

你可以手动注入它,就像这篇文章中提到的那样。

另一件事是使HerculesRestAccessorapplicationName可注入。或者,你可以将应用程序名称作为配置属性,并注入配置。如果这样做,那么你可以将过滤器注册为类,所有注入都应该起作用。


@peeskillet..谢谢..:) 我会注入两个字段并将过滤器注册为类。 - Abhishek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接