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

如何在嵌入式灰熊泽西应用程序的main方法中注入带有HK2的对象

罗新
2023-03-14

我在使用泽西岛设计REST微服务时遇到了一个捕获22问题。我正在尝试创建一个带有嵌入式灰熊服务器的应用程序,以降低部署复杂性。因此,我有一个创建灰熊服务器的主要方法。我需要在服务器的引导过程之前注入一些对象。

我的主要内容如下:

public static void main(String[] args) {
    App app = new App(new MyResourceConfig());
    // Need to inject app here.
    app.init(args);
    app.start();        
}

如何获取ServiceLocator单例实例,以便注入我的应用程序对象?

我尝试过:

ServiceLocatorFactory.getInstance()
                     .create("whatever")
                     .inject(app);

然而,我需要将所有的< code>AbstractBinder绑定到它两次(因为我已经在我的< code>ResourceConfig中这样做了)。

共有2个答案

路扬
2023-03-14

在我的场景中,我不得不将我的Jersey应用程序和其他servlet一起部署在同一个Grizzly servlet容器中,这确实有点痛苦。

但后来我发现 https://github.com/jersey/jersey/pull/128 拯救了我的一天。看看那个拉取请求,这就是我想到的:

WebappContext webappContext = new WebappContext("myWebappContext");

webappContext.addListener(new ServletContextListener() {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        sce.getServletContext().setAttribute(ServletProperties.SERVICE_LOCATOR, MY_SERVICE_LOCATOR);
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) { }
});

ServletRegistration servlet = webappContext.addServlet("myAppplication", new ServletContainer(resourceConfig));
servlet.addMapping("/application/*");

ServletRegistration hello = webappContext.addServlet("myServlet", MyServlet.class);
hello.addMapping("/servlet/*");

HttpServer createHttpServer = GrizzlyHttpServerFactory.createHttpServer(MY_URI, false);
webappContext.deploy(createHttpServer);
createHttpServer.start();
通和裕
2023-03-14

将所有AbstractBinder绑定到您正在创建的ServiceLocator,然后将该定位器传递给Grizzly服务器创建工厂方法之一。这将是Jersey将从中提取所有服务并将其插入另一个定位器的父定位器。例如,类似

ServiceLocator serviceLocator = SLF.getInstance().create(...);
ServiceLocatorUtilities.bind(serviceLocator, new Binder1(), new Binder2());
App app = new App();
serviceLocator.inject(app);
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(
        URI.create(BASE_URI),
        resourceConfig, 
        serviceLocator
);

你需要确保你有泽西-灰熊的依赖性,而不仅仅是灰熊。

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-http</artifactId>
</dependency> 

另请参见:

  • 用于ServiceLocatorUtilities的Javadoc
  • GrizzlyHttpServerFactory的Javadoc

注意:

如果您尝试使用GrizzlyWebContainerFactory创建Grizzly servlet容器,尝试完成上述工作将很困难。没有工厂方法来传递定位器。泽西确实添加了带有属性ServletProperties.SERVICE_LOCATOR的支持,但即使这样,属性值也应该是ServiceLocator。Grizzly servlet容器的工厂方法只接受Map

 类似资料:
  • 我已经设法在Jersey,HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上遵循了这个例子。) 我现在很好奇将JPA EntityManager注入我的资源类中的最佳方法是什么?(我目前正在考虑一个请求作为一个工作单元)。我目前正在研究的一个选项是以以下方式使用: null (我不想仅仅为了覆盖这个用例而依赖于重量级容器或额外的依赖注入库。)

  • 我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并

  • 我正在迁移一个遗留服务框架,该框架使用java序列化/反射来注册服务,并将它们作为远程endpoint(javabin over http)或本地调用无缝地调用。我已经将远程调用替换为jerseyendpoint。并使用基于hk2 aop的拦截器重新构建了现有框架的部分拦截能力。当远程客户端调用endpoint时,它工作正常。现在,我需要对服务方法的本地调用执行相同的操作,并且能够使用与远程服务方

  • 这是我为我的HTTPServer编写的内容: 任何帮助都将不胜感激。

  • 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个对象。 必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调

  • 我不想让泽西做任何依赖注射。我认为有从Jersey到Guice的桥梁,但是基于我不能在这里显示的程序需求,我需要自己创建REST控制器实例,并向Guice请求它们。 我的问题:我怎样才能禁用泽西岛的依赖注入? 我当前正在使用注释。也许我可以改用注释,以为Jersey不会在寻找这些注释。但我还是宁愿把泽西岛的依赖注射关了。我怎么能那样做?