Jersey通常使用HK2依赖注入,但我想使用Dagger 2与Jersey一起使用。Dagger和HK2都实现了JSR 330,这使我相信可以在不费太多力气的情况下实现。我找到了让Jersey与CDI(如Weld)、Spring DI和Guice配合使用的方法,但在Dagger上却找不到任何信息。
为提供一些上下文:我在SE环境中运行Grizzly-Jersey服务器,而非在EE容器中。我的Maven项目有com.google.dagger:dagger
和org.glassfish.jersey.containers:jersey-container-grizzly2-http
作为依赖项,但没有org.glassfish.jersey.inject:jersey-hk2
,因为我想用Dagger替换HK2。
资源类的代码如下:
@Path("/example")
public final class ExampleResource {
private final Dependency dependency;
@Inject
public ExampleResource(final Dependency dependency) {
this.dependency = Objects.requireNonNull(dependency);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Example getExample() {
return this.dependency.giveExample();
}
}
而Dagger组件可以定义如下:
@Component
public interface Application {
public ExampleResource exampleEndpoint();
public XyzResource xyzEndpoint();
// etc.
}
这样主方法看起来会与以下类似:
public final class Main {
public static void main(final String[] args) {
final Application application = DaggerApplication.create();
final URI baseUri = UriBuilder.fromUri("http://0.0.0.0/").port(80).build();
final ResourceConfig resourceConfig = new ResourceConfig();
// how to initialize `resourceConfig` using `application`?
final HttpServer httpServer = GrizzlyHttpServerFactory
.createHttpServer(baseUri, resourceConfig, false);
try {
httpServer.start();
} catch (final IOException ex) {
...
}
}
}
运行应用程序会立即导致异常:IllegalStateException:InjectionManagerFactory not found。
似乎需要Dagger实现此工厂。
我的问题是:如何将Dagger与Jersey集成?
dagger-servlet
仅适用于Dagger 1,与Dagger 2不兼容...很遗憾。@OleksandrShpota和@Dogs - Rinke