@Context注入无效在Jersey ContainerRequestFilter(Dropwizard)

@Context注入适用于类,但不能使它与Objects一起使用。

ContainerRequestFilter中的httpServletRequest生成空指针。

Dropwizard版本: – 1.1.0

ContainerRequestFilter

公共类ApplicationIPAuthFilter实现ContainerRequestFilter {private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationIPAuthFilter.class); 私人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 {//需要remote Ip String remoteIp = this.httpServletRequest.getRemoteAddr();  ....}} 

DynamicFeature


 @Provider
公共类ApplicationIPAuthFeature实现DynamicFeature {

    私人决赛HerculesRestAccessor访问者;
     private final String applicationName;

     public ApplicationIPAuthFeature(HerculesRestAccessor accessor,String applicationName){

         this.accessor = accessor;
         this.applicationName = applicationName;
     }

     @覆盖
     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以基于ipvalidation请求。

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

这是DynamicFeature的一个已知问题 。 注册为对象时,注入不起作用。

您可以做的一件事是手动注入它,就像这篇文章中提到的那样。

您可以做的另一件事是使HerculesRestAccessorapplicationName可注入。 或者更确切地说,使应用程序名称可注入,您可以使其成为配置属性并注入配置 。 如果这样做,那么您可以将filter注册为一个类,并且所有注入都应该有效。