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

如何将Guice与Jersey JdkHttpServerFactory一起使用?

洪雨石
2023-03-14

这是一个Java SE应用程序。我只想用Guice注射。我读过关于HK2活页夹的信息,我宁愿使用Guice。我熟悉Guice并经常使用它,但我不知道从哪里开始使用它,几乎我所有的Googlefu都指向基于容器的jersey服务器。我对灰熊也不感兴趣。

那么,我如何实现这一点,以便我可以使用Guice来满足我的注射需求呢?

import java.net.URI;
import javax.ws.rs.core.UriBuilder;

import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.roycat.rnotes.ws.guice.MainModule;
import com.roycat.rnotes.ws.server.CustomResourceConfig;

public class StartRestServer {

    public static void main(String[] args) {

        String base = "localhost";
        Integer port = 8090;

        if (args.length == 1) {
            base = args[0];
        } else if (args.length == 2) {
            base = args[0];
            port = Integer.parseInt(args[1]);
        }       

        URI baseUri = UriBuilder.fromUri("http://" + base
                      + "/").port(port).build();
        ResourceConfig config = new CustomResourceConfig();
        JdkHttpServerFactory.createHttpServer(baseUri, config);

        System.out.println("Server running on " + baseUri.toString() 
            + "...");
    }
}

共有1个答案

通京
2023-03-14

您可以使用HK2 guice-bridge将guice服务桥接到HK2。

<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>guice-bridge</artifactId>
    <version>2.4.0-b31</version>
</dependency>

请注意

然后你需要给桥编码。我刚刚在一个功能中完成了它

@Priority(1)
public class GuiceFeature implements Feature {

    @Override
    public boolean configure(FeatureContext context) {
        ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context);
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator);
        Injector injector = Guice.createInjector(new MyGuiceModule());
        GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(injector);
        return true;
    }
}

然后用您的< code>ResourceConfig注册该功能

config.register(GuiceFeature.class);

现在,您应该能够将Guice服务注入到您的泽西组件中。

这是一个完整的工作测试

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.sun.net.httpserver.HttpServer;
import java.net.URI;
import java.util.logging.Logger;
import javax.annotation.Priority;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.core.Response;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.ServiceLocatorProvider;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import static org.junit.Assert.assertEquals;

public class JdkHttpGuiceTest {

    @Priority(1)
    public static class GuiceFeature implements Feature {
        @Override
        public boolean configure(FeatureContext context) {
            ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context);
            GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator);
            Injector injector = Guice.createInjector(new EncoderModule());
            GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
            guiceBridge.bridgeGuiceInjector(injector);
            return true;
        }
    }

    public static interface Encoder {
        String encode(String value);
    }

    public static class UppercaseEncoder implements Encoder {
        @Override
        public String encode(String value) {
            return value.toUpperCase();
        }
    }

    static class EncoderModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(Encoder.class).to(UppercaseEncoder.class);
        } 
    }

    @Path("test")
    public static class TestResource {
        @Inject
        private Encoder encoder;

        @GET
        public String get(@QueryParam("s") String s) {
            return encoder.encode(s);
        }
    }

    public static class AppConfig extends ResourceConfig {
        public AppConfig() {
            register(TestResource.class);
            register(GuiceFeature.class);
            register(new LoggingFilter(Logger.getAnonymousLogger(), true));
        }
    }

    private HttpServer server;

    @Before
    public void setUp() {
        server = JdkHttpServerFactory.createHttpServer(
                URI.create("http://localhost:8080/"), new AppConfig());
    }

    @After
    public void tearDown() {
        server.stop(1);
        server = null;
    }

    @Test
    public void injectionShouldWork() {
        final Response response = ClientBuilder.newClient().target("http://localhost:8080/test")
                .queryParam("s", "hello")
                .request().get();
        assertEquals(200, response.getStatus());
        assertEquals("HELLO", response.readEntity(String.class));
    }
}

使用的依赖项

<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>guice-bridge</artifactId>
    <version>2.4.0-b31</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-jdk-http</artifactId>
    <version>2.22.2</version>
</dependency>

 类似资料:
  • 我是Guice和Shiro的新手,我正在尝试将它与我的DB(h2)一起使用。我读过这个:点击 但正如他们所说,它只是为用户和角色部分工作,这对我来说是无用的。 我的shiro.ini正在工作,我成功地创建了用户,登录和注销没有Guice部分。 我的工具 和我的模块: 公共类模块扩展抽象模块 { 他们就像教程里说的那样。要使用我的shiro.ini的[main]部分,我需要添加什么?

  • 我在Ubuntu 14.04中安装了phpbrew以使用PHP5.4。它工作得很好,但当我尝试使用composer时除外,composer会忽略phpbrew并安装与PHP5.5相关的依赖项。 有没有办法强制composer与phpbrew config兼容?我试图在我的作曲家中添加:php:“5.4”。json,但是它说这个要求在我的php版本中是不可能的。

  • 我是Micronaut框架的新手,我正在尝试使用entitymanager创建我的存储库。我这样创建了我的存储库 我使用这个类实现接口并注入entitymanager 问题是我一直有这个错误: PS:我已经启用了注释处理

  • 我正在尝试将composer与我的WampServer一起使用。 我所有文件的路径都是,但当我运行composer时,它会将供应商文件和其他东西安装到其他地方。 我甚至不知道我的项目在哪里,我也不能改变我的项目在哪里的路径。我已经尝试了所有的方法,但它似乎仍然没有在我的项目文件夹中安装供应商文件。

  • API level 28和Google建议使用registerNetworkCallback(NetworkRequest,PendingIntent)不推荐CONNECTIVITY\u操作。 我尝试使用ConnectionManager注册了registerNetworkCallback。NetworkCallback和它的工作,但我想使用PendingContent。 让我困惑的是公共空寄存器

  • 问题内容: 当我尝试将Webpack与简单的Express服务器一起使用时,总是会收到大量错误消息: express.js 我得到所有这些错误: 这是我的配置文件: 我该怎么办,我还需要在服务器端使用webpack。 我像这样运行express.js文件: 问题答案: 我最终要做的是,我使用了两种不同的配置,一种用于使用webpack将服务器内容打包在一起,另一种用于将所有浏览器内容打包在一起,并