如何将CDI依赖注入到JAX-RS ClientRequestFilter提供程序中

3

我有一个实现了ClientRequestFilter的@Provider。但是这个提供者本身并没有被发现。当我手动注册它时,它就会被发现。

ClientBuilder.newBuilder().register(Somefilter.class);

然而,这种方式下,CDI不会向Somefilter注入依赖项。

  • AS:WildFly 10
  • JAX-RS:Resteasy(内置于WildFly中)

我的Somefilter类的代码如下所示。

@Provider
public class Somefilter implements ClientRequestFilter {

@Inject
private AccountService accountService;


@Override
public void filter(ClientRequestContext requestContext) throws IOException {
    System.out.println(accountService);

}

该应用程序还具有一个服务器部分,使用@Application注释进行配置,并使用一些实现ContainerRequestFilter的类。这些由Resteasy发现,甚至CDI注入也可以工作。

因此问题是,如何使客户端API相关提供者注入CDI依赖项。

2个回答

3

@Provider 的实现在服务器端可以自动发现,但在客户端则不能。

尝试以下操作:

@Inject
private Somefilter someFilter;

ClientBuilder.newBuilder().register(someFilter);

请务必在Somefilter上添加一个bean定义注释(例如@Dependent)。


有没有可能在每个请求中实例化过滤器? - Pavel Pscheidl
我猜是的,如果过滤器是@RequestScoped - Harald Wellmann

0

请确保导入了正确的包javax.enterprise.context以声明您的服务类的@RequestScoped范围:

import javax.enterprise.context.RequestScoped;

@Named
@RequestScoped
public class AccountService {

}

我遇到了这个问题,后来发现我错误地使用了Faces(JSF)包,而应该使用javax.faces.bean.RequestScoped

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接