java REST API中对ContainerRequestFilter的注入
我想我是在对付玻璃鱼4中的一只虫子;但我不确定。基本上,我尝试将服务注入ContainerRequestFilter;但我在尝试时遇到了一个例外。我可以在进行rest调用的资源中进行注入,但不能将注入用于过滤器。玻璃鱼jira中有一个归档的bug:。我尝试了上面提到的解决方法,但没有解决我的问题 以下是我得到的一个例外:java REST API中对ContainerRequestFilter的注入,java,rest,glassfish,jersey,jax-rs,Java,Rest,Glassfish,Jersey,Jax Rs,我想我是在对付玻璃鱼4中的一只虫子;但我不确定。基本上,我尝试将服务注入ContainerRequestFilter;但我在尝试时遇到了一个例外。我可以在进行rest调用的资源中进行注入,但不能将注入用于过滤器。玻璃鱼jira中有一个归档的bug:。我尝试了上面提到的解决方法,但没有解决我的问题 以下是我得到的一个例外: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=Authenticator,parent=SecurityInterceptor,qualifiers
这是我正在使用的代码,你知道我在这里缺少什么吗
@Provider
@PreMatching
public class SecurityInterceptor implements ContainerRequestFilter {
@Inject
private Authenticator authenticator; // can't inject this service here, but I can inject this to RequestScoped Resources
private static final Logger LOG = Logger.getLogger(SecurityInterceptor.class.getName());
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if (!requestContext.getMethod().equals("OPTIONS")) {
String path = OyumBuFunctions.normalizeString(requestContext.getUriInfo().getPath());
String authToken = requestContext.getHeaderString(OyumbuRestHeaders.AUTH_TOKEN_HEADER);
if (!authenticator.isAuthTokenValid(authToken)) {
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
}
else{
LOG.log(Level.INFO, "authenticated");
}
}
}
}
如本回答中所述,为要注入的服务提供
@Path
注释可以避免这种情况。我仍然不知道如何正确地解决这个问题,只是把它写在这里,以便对遇到类似问题的人有用。我遇到了类似的问题,在寻找解决方案时遇到了这个帖子。幸运的是,我找到了一个解决方案,并想把它贴在这里。注意,这只在JAX-RS2.0中有效,因为它使用了DynamicFeature类
@Provider
public class AuthenticatorFeature implements DynamicFeature {
@Inject
private Autheticator authenticator;
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
context.register(new SecurityInterceptor(authenticator);
}
}
将身份验证程序绑定到ContainerRequestFilter
public class SecurityInterceptor implements ContainerRequestFilter {
Authenticator authenticator;
public SecurityInterceptor(Authenticator authenticator){
this.authenticator = authenticator;
}
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
authenticator.doSomething(...);
}
}
一些希望有用的阅读资料
即使在jersey 2.29上,此解决方案也适用于我。谢谢