在java REST API中注入ContainerRequestFilter

时间:2014-06-26 10:07:44

标签: java rest glassfish jersey jax-rs

我想我正在处理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");
            }
    }        
  }
}

2 个答案:

答案 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(...);
    }
}

一些希望有用的读物​​

creating resource filters with jersey and jaxrs 2.0

Securing REST Resources with JAX-RS 2.0

答案 1 :(得分:0)

正如本回答https://stackoverflow.com/a/23996225/1045081中所述,为要注入的服务提供@Path注释可以保存这种情况。仍然不明白如何正确地解决它,但只是在这里写它,以便它可以对遇到类似问题的人有用。