如何将对象注入到需要@context的Jersey Dropwizard的AuthFilter中?

问题描述 投票:1回答:1

我想知道如何在jersey中注册一个AuthDynamicFilter时注入一个对象。

public class CustomApplication extends Application<Configuration> {
   public void run(Configuration configuration, Environment environment) throws Exception {
      ...

      environment.jersey().register(new AuthDynamicFeature(CustomAuthFilter.class));   
      ...
   }
}

自定义动态过滤

@PreMatching
public class CustomAuthFilter<P extends Principal> extends AuthFilter<String, P> {
   private final Object identity;

   @Context
   private HttpServletRequest httpServletRequest;

   @Context
   private HttpServletResponse httpServletResponse;

   public LcaAuthFilter(Identity identity) {
     this.identity = identity;
   }

   @Override
   public void filter(ContainerRequestContext requestContext) throws IOException {
       ...identity.process(httpServletRequest)
   }

}

上面的代码无法编译,因为在创建CustomAuthFilter时没有办法注入Identity对象。

如果你使用:

   environment.jersey().register(new AuthDynamicFeature(new CustomerAuthFilter(new Identity())));

在这种情况下,httpServletRequest将被设置为null。

我唯一能想到的解决方法就是不使用AuthDynamicFeature,只使用普通的Filter,然后注入它,这样就可以了。 我想知道用AuthDynamicFeature你会怎么做。

我对dropwizard和jersey还是新手,所以请大家多多包涵。 一些概念,我可能会乱。

任何建议欣赏,谢谢,德里克

jersey dropwizard dynamic-feature dropwizard-guice
1个回答
0
投票

我有一个应用程序就是这样做的。在构造函数中注解 @Inject:

@PreMatching
public class CustomAuthFilter<P extends Principal> extends AuthFilter<String, P> {
   private final Identity identity;

   @Context
   private HttpServletRequest httpServletRequest;

   @Context
   private HttpServletResponse httpServletResponse;

   // Annotate the ctor with @Inject
   @Inject
   public LcaAuthFilter(Identity identity) {
     this.identity = identity;
   }

   @Override
   public void filter(ContainerRequestContext requestContext) throws IOException {
       ...identity.process(httpServletRequest)
   }

}

告诉泽西岛的依赖注入机制,以注入 identity 与你提供的价值。

Identity identity = getTheIdentity();
environment.jersey().register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(identity).to(Identity.class);
    }
});
environment.jersey().register(new AuthDynamicFeature(CustomAuthFilter.class));

如果 identity 只有在运行时才知道,使用 Supplier<Identity> 而不是(调整你的构造函数)。

Supplier<Identity> identity = getTheIdentitySupplier();
environment.jersey().register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(identity).to(new TypeLiteral<Supplier<Identity>>(){});
    }
});
environment.jersey().register(new AuthDynamicFeature(CustomAuthFilter.class));
© www.soinside.com 2019 - 2024. All rights reserved.