【问题标题】:Jersey with embedded Jetty resolving dependency injection in Resource带有嵌入式 Jetty 的 Jersey 解决了 Resource 中的依赖注入
【发布时间】:2015-08-10 19:02:53
【问题描述】:

在尝试注入资源的依赖项时,我在将 Jersey 与 Jetty 连接时遇到了麻烦。我正在做的是:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new MyBinder());
    }
}

我的活页夹简化了:

public class MyBinder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(ManagerImpl.class).to(Manager.class);
        }
   }

我的资源也简化了:

@Path("test")
public class MyResource {

    @Inject
    Manager manager;
...
}

我试过这个把所有的东西连接在一起:

ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
ServletContainer jerseyServletContainer = new ServletContainer(new MyApplication());
ServletHolder jerseyServletHolder = new ServletHolder(jerseyServletContainer);
jerseyServletHolder.setInitParameter("jersey.config.server.provider.classnames", MyResource.class.getCanonicalName());
servletContextHandler.setContextPath("/");
servletContextHandler.addServlet(jerseyServletHolder, "/*");

Server server = new Server(threadPool);
ServerConnector connector = new ServerConnector(server);
connector.setPort(httpPort);
server.setConnectors(new Connector[]{connector});
server.setHandler(servletContextHandler);
server.start();

但是我一直收到 HTTP ERROR: 404

有什么办法可以对其进行排序吗?

谢谢

【问题讨论】:

  • 您的请求网址是什么?
  • 我有一个类似的项目,但它不使用你正在做的注入 here 也许它可以帮助你前进。
  • 0.0.0.0:8800/test?some=stuff,但是我发现了 dropwizard,它基本上解决了我的所有问题,实现了我的目标。甚至集成Guice进行注射。 codingricky.com/dropwizard-and-guice-integration
  • 太棒了。我应该建议...我已经使用 dropwizard 和 guice 几年了,并且喜欢它。 Metrics 库是不可或缺的。

标签: java jersey jetty


【解决方案1】:

好的,我也让它在没有 dropwizard 和 guice 的情况下工作。由于某些原因,自 2.XX 版本以来,Jersey 实现不包括 GuiceComponentProviderFactory。否则有可能做这样的事情:

Injector injector =  Guice.createInjector( new ServletModule() { ...} );
IoCComponentProviderFactory ioc = new GuiceComponentProviderFactory( resourceConfig, injector );
Server server = JettyHttpContainerFactory.createHttpServer( BASE_URI + "services/", resourceConfig, ioc );

自 2.X 版以来,他们将 HK2 IoC 框架与 GuiceBirdge 集成在一起,因此您需要弄乱 HK2 和 Guice:

GuiceBridge.getGuiceBridge().initializeGuiceBridge(aServiceLocator);

所以我暂时只坚持使用 HK2,让它以这种方式连接在一起:

URI baseUri = UriBuilder.fromUri("http://localhost/").port(8800).build();
Server server = JettyHttpContainerFactory.createServer( baseUri, new MyApplication() );
server.start();

我的资源配置:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new MyBinder());
        register(MyResource.class);
    }
}

所以我只是错过了在注册我的活页夹之上注册我的资源。因此,通过这种方式,我根本没有使用 web.xml 并拥有很好的嵌入式码头服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2015-08-02
    • 2013-04-19
    相关资源
    最近更新 更多