Java 如何在嵌入式Grizzly Jersey应用程序的main方法中使用HK2注入对象

Java 如何在嵌入式Grizzly Jersey应用程序的main方法中使用HK2注入对象,java,java-8,jersey-2.0,hk2,Java,Java 8,Jersey 2.0,Hk2,在使用Jersey设计REST微服务时,我遇到了一个棘手的问题。我正在尝试创建一个带有嵌入式grizzly服务器的应用程序,以降低部署复杂性。因此,我有一个创建grizzly服务器的主要方法。我需要在服务器的引导过程之前注入一些对象 我的主要观点如下: public static void main(String[] args) { App app = new App(new MyResourceConfig()); // Need to inject app here.

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

我的主要观点如下:

public static void main(String[] args) {
    App app = new App(new MyResourceConfig());
    // Need to inject app here.
    app.init(args);
    app.start();        
}
如何获取
ServiceLocator
singleton实例,以便注入我的应用程序对象

我试过:

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

但是,我需要将所有
AbstractBinder
绑定到它上两次(因为我已经在
ResourceConfig
中进行了绑定)。

将所有
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
);
您需要确保您拥有Jersey Grizzly依赖项,而不仅仅是Grizzly


org.glassfish.jersey.containers

  • 注意:


    如果您正试图使用
    GrizzlyWebContainerFactory
    创建一个Grizzly servlet容器,那么尝试进行上述工作将很困难。没有工厂方法传递定位器。Jersey确实添加了对属性
    ServletProperties.SERVICE\u LOCATOR
    的支持,但即使如此,属性值也应该是
    ServiceLocator
    。grizzly servlet容器的工厂方法只接受init参数的
    Map
    。该属性实际上是由使用Jetty embedded的第三方贡献者添加的,Jetty embedded确实具有将值设置为对象的init参数的方法。因此,如果您想获得支持,您可能需要向Jersey提交一个问题。

    为了扩展@peeskillet的伟大答案,在我的场景中,我不得不将Jersey应用程序与其他servlet部署在同一个Grizzly servlet容器中,确实有点痛苦

    但后来我找到了救我一天的原因。看看这个请求,我想到的是:

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

    对于以后发现此项的任何人,不再将ServiceLocator作为parameter@tzenes