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