Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java REST API中对ContainerRequestFilter的注入_Java_Rest_Glassfish_Jersey_Jax Rs - Fatal编程技术网

java REST API中对ContainerRequestFilter的注入

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

我想我是在对付玻璃鱼4中的一只虫子;但我不确定。基本上,我尝试将服务注入ContainerRequestFilter;但我在尝试时遇到了一个例外。我可以在进行rest调用的资源中进行注入,但不能将注入用于过滤器。玻璃鱼jira中有一个归档的bug:。我尝试了上面提到的解决方法,但没有解决我的问题

以下是我得到的一个例外:

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上,此解决方案也适用于我。谢谢