【问题标题】:How to inject CDI dependency into JAX-RS ClientRequestFilter provider如何将 CDI 依赖项注入 JAX-RS ClientRequestFilter 提供程序
【发布时间】:2016-07-13 04:56:31
【问题描述】:

我有一个实现 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 依赖项。

【问题讨论】:

    标签: jakarta-ee jersey jax-rs cdi


    【解决方案1】:

    @Provider 实现是在服务器端自动发现的,但不是在客户端。

    试试这个:

    @Inject
    private Somefilter someFilter;
    
    ClientBuilder.newBuilder().register(someFilter);
    

    确保向Somefilter(例如@Dependent)添加定义bean的注释。

    【讨论】:

    • 是否有可能以某种方式根据请求实例化过滤器?
    • 我想是的,如果过滤器是@RequestScoped
    【解决方案2】:

    确保您正在导入正确的包 javax.enterprise.context,以便为您的服务类声明 @RequestScoped 范围:

    import javax.enterprise.context.RequestScoped;
    
    @Named
    @RequestScoped
    public class AccountService {
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多