当前位置: 首页 > 知识库问答 >
问题:

如何在运行Grizzly的java se上启用CDI inject in web service(JAXRS/Jersey)?

柯骏
2023-03-14
import training.student.StudentRepository;
import javax.inject.Inject;
import javax.ws.rs.*;

@Path("student")
public class StudentWebResource {
  @Inject
  private StudentRepository studentRepository;  

  @GET
  @Path("count")
  @Produces(MediaType.TEXT_PLAIN)
  public Integer getCount() {
    return studentRepository.studentCount();
  }
}
public class Main {
  public static void main(String[] args) throws Exception {
    startCdiApplication();
  }

  public static void startCdiApplication() throws Exception {
    Weld weld = new Weld();
    try {
      WeldContainer container = weld.initialize();
      Application application = container.instance().select(WebServer.class).get();
      application.run();
    } 
    finally {
      weld.shutdown();
    }
  }
}

我怀疑需要修改代码才能通知泽西使用weld进行CDI注入解析:

...
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class WebServer implements Application {

  /*
   * startup the grizzly http server to make available the restful web services
   */
  private void startWebServer() throws IOException, InterruptedException {
    final ResourceConfig resourceConfig = new ResourceConfig().packages("training.webservice").register(new JacksonFeature());
    final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(getBaseUri(), resourceConfig);
    server.start();
    Thread.currentThread().join();
  }

  ...

  @Override
  public void run() throws IOException, InterruptedException {
    startWebServer();
  }
}

共有1个答案

魏誉
2023-03-14

在看到这篇stackoverflow帖子后,我实现了以下解决方案。不确定这是不是最好的路线,但它奏效了。

我创建了一个hk2活页夹并注册了该活页夹:

public class WebServiceBinder extends AbstractBinder {

  @Override
  protected void configure() {
    BeanManager bm = getBeanManager();
    bind(getBean(bm, StudentRepository.class))
        .to(StudentRepository.class);
  }

  private BeanManager getBeanManager() {
    // is there a better way to get the bean manager?
    return new Weld().getBeanManager();
  }

  private <T> T getBean(BeanManager bm, Class<T> clazz) {
    Bean<T> bean = (Bean<T>) bm.getBeans(clazz).iterator().next();
    CreationalContext<T> ctx = bm.createCreationalContext(bean);
    return (T) bm.getReference(bean, clazz, ctx); 
  }
}

然后将ResourceConfig实例化从上面修改为:

final ResourceConfig resourceConfig = new ResourceConfig()
    .packages("training.webservice")
    .register(new JacksonFeature())
    .register(new WebServiceBinder());
 类似资料:
  • 问题内容: 如何允许CDI将资源注入宁静的Web服务资源?我正在使用weld 2(cdi),球衣(jaxrs)和grizzly(Web服务器)在标准java上运行。这是我的简单网络资源: 这是我如何启动简单的Web服务器的方法: 我怀疑需要修改的代码以通知球衣使用焊缝进行CDI注入分辨率: 问题答案: 看到这个stackoverflow帖子之后,我实现了以下解决方案。不知道这是否是最好的选择,但是

  • 我有一台带有Intel CPU的Windows机器(在引导菜单上启用VMX)。我使用VirtualBox在上面运行Ubuntu Guest。我在上面运行qemu,以运行另一个Guest OS,使用kvm(选项)。 我在尝试插入kvm-intel模块时收到以下错误: 我已经检查了来宾操作系统中的vpx标志,但我也没有看到 有没有办法在来宾Ubuntu操作系统中启用kvm支持,以便我可以在Ubuntu

  • 我在mac os X上开发了jersey web服务服务器。我一直在使用maven命令行:运行它进行测试,它工作得很好。我目前正在Grizzly中运行我的web服务。 null 这就是我编译jar文件的方式: 这就是我运行jar文件的方式:。以下是错误: myname-macbook-pro:target myname$java-jar application-1.0-snapshot.jar异常

  • 使用Eclipse Juno Service Release 1,我创建了一个Google App Engine项目,然后手动将JAX-RS和JAXB jar文件复制到war/WEB-INF/lib中(因为试图在“项目方面”属性中添加JAX-RS会导致错误,即需要安装动态WEB模块,我认为这是不需要的,因为jar已经包含在GAE项目中? 当我在本地运行时,项目启动正常,我可以导航到我的虚拟rest

  • 问题内容: 我刚刚开始学习TDD,并且正在使用Tkinter GUI开发程序。唯一的问题是,一旦调用该方法,测试套件就会挂起,直到关闭窗口。 这是我的代码的示例: 测试Tkinter应用程序的合适方法是什么?还是只是“不”? 问题答案: 您可以做的一件事是在单独的线程中生成mainloop并使用您的主线程运行实际的测试;照看mainloop线程。进行断言之前,请确保检查Tk窗口的状态。 多线程处理

  • 问题内容: 运行Airflow的常规说明不适用于Windows环境: Airflow实用程序在命令行中不可用,我在其他地方找不到要手动添加的实用程序。Airflow如何在Windows上运行? 问题答案: 您可以在Windows中激活,并直接按照本教程进行操作。我能够按照上面的步骤启动并成功运行。 安装完成后,请进行编辑以将所有配置指向Windows系统中的某个位置,而不是lxss(ubuntu)