2017-05-21 42 views
2

@Context注入与类的工作,但无法使其与对象工作。@Context注入工作在泽西岛ContainerRequestFilter(Dropwizard)

ContainerRequestFilter中的httpServletRequest产生空指针。

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 { 
     // need remote 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) { 

      // not working 
      context.register(new ApplicationIPAuthFilter(accessor, applicationName)); 

      //@Context injection works in ContainerRequestFilter for classes 
      //context.register(ApplicationIPAuthFilter.class); 
     } 
    } 
} 

我想在ContainerRequestFilter获取远程IP验证基于IP的请求。

如何解决此问题..需要帮助?

回答

3

It's a known issue with DynamicFeature。注册为对象时注入不起作用。

你可以做的一件事是手动注入它,就像在this post中提到的那样。

您可以做的另一件事是使HerculesRestAccessorapplicationName注射。或者,而不是使应用程序名称注入,您可以使其成为一个配置属性和inject the configuration。如果你这样做,那么你可以注册过滤器作为一个班,所有的注射应该工作。

+0

@ peeskillet..Thanks .. :)将注入这两个字段并将过滤器注册为一个类。 – Abhishek