我想知道如何在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还是新手,所以请大家多多包涵。 一些概念,我可能会乱。
任何建议欣赏,谢谢,德里克
我有一个应用程序就是这样做的。在构造函数中注解 @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));