Jersey 如何在JAX-RS客户机中使用CDI

Jersey 如何在JAX-RS客户机中使用CDI,jersey,jax-rs,cdi,embedded-jetty,weld,Jersey,Jax Rs,Cdi,Embedded Jetty,Weld,我在SO和官方文档上搜索了一段时间,但我找不到一种直接使用CDI注入到JAX-RS客户机的方法 我使用builder方法检索一个客户机,我想注册一个WriterInterceptor(或任何类似过滤器的组件),它使用注入来检索另一个bean 我希望使用CDI注入,并避免向HK2注册每个bean ClientBuilder.newBuilder() .register(MyWriter.class) .build(); 还有我的作家和注入类 @Pr

我在SO和官方文档上搜索了一段时间,但我找不到一种直接使用CDI注入到JAX-RS客户机的方法

我使用builder方法检索一个客户机,我想注册一个
WriterInterceptor
(或任何类似过滤器的组件),它使用注入来检索另一个bean

我希望使用CDI注入,并避免向HK2注册每个bean

ClientBuilder.newBuilder()
            .register(MyWriter.class)
            .build();
还有我的作家和注入类

@Provider
public class MyWriter implements WriterInterceptor {
    private final MyRepo repo;

    @Inject
    public MyWriter(MyRepo repo) {
        this.repo = repo;
    }

    @Override
    public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
        context.proceed();
    }
}

public class MyRepo {

}

我使用Jersey 2和Weld SE在嵌入式jetty中运行。

可以使用Welve注入java SE应用程序

 @Singleton
public class Application {

private static Logger logger = LoggerFactory.getLogger(Application.class);

    @inject
    private SomeOtherBean injectedBean;

public void run() {
    logger.debug("application initialized");
        injectedBean.doSomething();

}

}
内主井

import java.io.IOException;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class EntryPoint {

  public static void main(String[] args) throws IOException {

   Weld weld = new Weld();
   WeldContainer container = weld.initialize();
   Application application = container.instance().select(Application.class).get();
   application.run();
   weld.shutdown();

  }
}
看看下面的文档

下面还有教程

如果我对所有内容都理解正确,那么这已经被询问过了。简而言之:您必须覆盖H2K绑定器的默认行为,这样它就可以访问Weld Bean管理器。您不必在以后向H2K注册每个Bean

编辑:要包含帖子中的所有内容,您无需阅读评论:

  • 这是针对服务器端的,而不是客户端的
  • 使用标准工具(和),这似乎是一个太大的开销/不可能做到的事情
  • 显然是在Dropwizard项目中进行自定义客户端注入

我已经在使用这种配置。我的问题是关于在JAX-RS客户机中使用CDI的问题,因为HK2注入优先于Weld,所以无法工作。这只适用于服务器端,我已经实现了您参考答案中描述的内容。事实上,您是正确的。和的结合不应该在客户端起作用吗?我没有设法为客户端更换定位器,而且仍然有手动查找工作,但我想直接使用注入。似乎可行,但有点黑客,据我所知Dropwizard的人解决了这个问题:看到了吗