2017-05-21 6 views
2

@Context injection arbeitet mit Klassen, kann aber nicht mit Objekten arbeiten.@Context-Injection funktioniert nicht in Jersey ContainerRequestFilter (Dropwizard)

httpServletRequest in ContainerRequestFilter erzeugt Nullzeiger.

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

ich remote ip in ContainerRequestFilter zu holen bin versucht Anfrage auf IP-basierte zu authentifizieren.

Wie behebe ich das .. brauchen Sie Hilfe?

Antwort

3

It's a known issue with DynamicFeature. Injektionen funktionieren nicht, wenn Sie sich als Objekt registrieren.

Eine Sache, die Sie tun können, ist es manuell zu injizieren, wie in this post erwähnt. Eine andere Sache, die Sie tun können, ist die HerculesRestAccessor und die applicationName injizierbaren. Anstatt den Anwendungsnamen injizierbar zu machen, können Sie eine Konfigurationseigenschaft und inject the configuration erstellen. Wenn Sie dies tun, können Sie den Filter als Klasse registrieren und alle Injektionen sollten funktionieren.

+0

@ peeskillet..Thanks .. :) Wird mit der Eingabe der beiden Felder gehen und den Filter als eine Klasse registrieren. – Abhishek

Verwandte Themen