当前位置: 首页 > 面试题库 >

如何在运行Grizzly的Java SE上启用Web服务(JAXRS / JR)中的CDI注入?

段恩
2023-03-14
问题内容

如何允许CDI将资源注入宁静的Web服务资源?我正在使用weld
2(cdi),球衣(jaxrs)和grizzly(Web服务器)在标准java上运行。这是我的简单网络资源:

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();
  }
}

这是我如何启动简单的Web服务器的方法:

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();
    }
  }
}

我怀疑需要修改的代码以通知球衣使用焊缝进行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();
  }
}

问题答案:

看到这个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());


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

  • 您好,我正试图在JBoss developer studio和Wildfly 11上构建一个简单的JaxRs web服务作为应用程序服务器,但我在尝试部署maven项目时遇到以下错误:

  • 免责声明:我刚刚开始使用OSGI,所以请忍受我和我的知识不足... 为了本练习,假设我有一个基于泽西岛 (2.17.0) 的 REST 应用程序在 OSGI 环境中的 Jetty (9.2.10) 下运行,它为用户提供了一些通过 SOAP 从单独的服务器收集的统计信息。 我现在尝试在另一个应用程序中重用一些现有代码,该应用程序应该通过JMS(或其他东西)检索统计信息。 我的目的是在捆绑包中为客户端

  • 我是web服务编程新手,我想使用netbeans 6在Grizzly服务器上使用Jersey创建一个restful web服务,然后创建一个客户端javascript,以便通过浏览器使用该web服务。因此,我开始了解更多关于restful web服务的知识,并在网上阅读了大量指南,然后通过阅读jersey用户指南http://jersey . Java . net/nonav/documentat

  • 问题内容: 我刚刚开始学习Python,现在我很迷路。我想在通过hosting24.com托管的服务器上运行脚本。他们的常见问题解答说他们支持Python,但是我不知道将脚本放在哪里运行。 我的根目录中有一个名为cgi-bin的文件夹,我猜这是我放置脚本的位置吗?有人可以向我解释这是如何工作的吗? 问题答案: 很简单,您可以将Python脚本重命名为“ pythonscript.cgi”。将其发布

  • 我希望运行在线程中的udp服务器在每次接收到数据报时都会触发一个事件,并发送格式为json的数据。 已为此事件定义了一个侦听器,它将调用websocketendpoint方法向所有连接的客户端广播此消息: 以及实际触发事件的处理程序: 是一个简单的POJO,其中包含要广播的消息。限定符: 这些是依赖项注入的第一步,因此我不太确定应该如何从线程内触发事件,以及如何初始化对象。我发现这个页面建议使用和