我想我正在处理Glassfish 4中的一个错误;但我不确定。基本上我正在尝试将服务注入ContainerRequestFilter;但我在尝试时遇到异常。我可以在我进行休息调用的资源中进行注入,但我不能使用注入过滤器。 glassfish jira中有一个提交的错误:https://java.net/jira/browse/GLASSFISH-20597。我尝试了那里提到的解决方法,但它没有解决我的问题。
以下是我得到的例外情况:
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");
}
}
}
}
答案 0 :(得分:1)
我遇到了类似的问题,在搜索解决方案时遇到了这个帖子。幸运的是我找到了一个解决方案,并考虑在此发布。请注意,这仅适用于JAX-RS 2.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(...);
}
}
一些希望有用的读物
答案 1 :(得分:0)
正如本回答https://stackoverflow.com/a/23996225/1045081中所述,为要注入的服务提供@Path
注释可以保存这种情况。仍然不明白如何正确地解决它,但只是在这里写它,以便它可以对遇到类似问题的人有用。