2017-05-21 8 views
2

@Contextインジェクションはクラスでは動作しますが、オブジェクトでは動作できません。@ContextインジェクションはJersey ContainerRequestFilter(Dropwizard)で動作しません

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 { 
     // 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); 
     } 
    } 
} 

私は、IPに基づいて要求を認証するためにContainerRequestFilterでリモートIPを取得しようとしています。

これを修正するにはどうすればよいですか?

答えて

3

It's a known issue with DynamicFeature。オブジェクトとして登録すると注入が機能しません。

あなたができることの1つは、this postに記載されているように手動で注入することです。

もう1つのことは、HerculesRestAccessorapplicationNameを注射可能にすることです。アプリケーション名を注入可能にするのではなく、それを構成プロパティとinject the configurationにすることができます。これを行うと、フィルターをクラスとして登録することができ、すべての注入が機能するはずです。

+0

@ peeskillet..Thanks .. :)両方のフィールドを注入し、クラスとしてフィルターを登録することになります。 – Abhishek

関連する問題