2017-05-21 1 views
2

L'injection @Context fonctionne avec les classes mais ne peut pas fonctionner avec les objets. HttpServletRequest dans ContainerRequestFilter génère un pointeur NULL.L'injection @Context ne fonctionne pas dans Jersey ContainerRequestFilter (Dropwizard)

Dropwizard Version: - 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); 
     } 
    } 
} 

Je suis en train de chercher ip à distance dans ContainerRequestFilter pour authentifier la demande basée sur IP.

Comment résoudre ce problème .. Besoin d'aide?

Répondre

3

It's a known issue with DynamicFeature. Les injections ne fonctionnent pas lors de l'enregistrement en tant qu'objet.

Une chose que vous pouvez faire est manuellement l'injecter, comme mentionné dans this post.

Une autre chose que vous pouvez faire est de faire le HerculesRestAccessor et le applicationName injectable. Ou plutôt, en rendant le nom de l'application injectable, vous pouvez en faire une propriété de configuration et inject the configuration. Si vous faites cela, vous pouvez enregistrer le filtre en tant que classe, et toutes les injections devraient fonctionner.

+0

@ peeskillet..Thanks .. :) Va aller avec l'injection des deux champs et enregistrer le filtre en tant que classe. – Abhishek