@Context注入可用于类,但不能使其与对象一起使用。

ContainerRequestFilter中的httpServletRequest产生空指针。

Dropwizard版本:-1.1.0

ContainerRequestFilter

公共类ApplicationIPAuthFilter实现ContainerRequestFilter {

私有静态最终Logger LOGGER = LoggerFactory.getLogger(ApplicationIPAuthFilter.class);
私有HerculesRestAccessor restAccessor;
私有字符串applicationName;

@上下文
私有HttpServletRequest httpServletRequest;

公共ApplicationIPAuthFilter(){
}

public ApplicationIPAuthFilter(HerculesRestAccessor访问器,字符串applicationName){
restAccessor =访问器;
this.applicationName = applicationName;
}

@Override
公共无效筛选器(ContainerRequestContext requestContext)引发IOException {
//需要远程IP
字符串remoteIp = this.httpServletRequest.getRemoteAddr();
....
}
}

动态功能

@提供者
公共类ApplicationIPAuthFeature实现了DynamicFeature {

私有的最终HerculesRestAccessor访问器;
私有最终String applicationName;

public ApplicationIPAuthFeature(HerculesRestAccessor访问器,字符串applicationName){

this.accessor =访问者;
this.applicationName = applicationName;
}

@Override
公共无效的configure(ResourceInfo resourceInfo,FeatureContext context){
如果(resourceInfo.getResourceMethod()。getAnnotation(ApplicationIPAuthRequired.class)!= null){

//不起作用
context.register(新的ApplicationIPAuthFilter(accessor,applicationName));

// @ Context注入可在ContainerRequestFilter中用于类
//context.register(ApplicationIPAuthFilter.class);
}
}
}

我正在尝试在ContainerRequestFilter中获取远程IP,以验证基于IP的请求。

我该如何解决..需要帮助?

最佳答案

It's a known issue with DynamicFeature。注册为对象时,注入无效。

您可以做的一件事是手动注入它,如this post中所述。

您可以做的另一件事是使HerculesRestAccessorapplicationName可注入。或者,而不是使应用程序名称可注入,您可以将其配置属性和inject the configuration设置为可注入。如果执行此操作,则可以将过滤器注册为一个类,并且所有注入都应该起作用。

08-28 17:37