从我在网上看到的情况来看,Guice + Jersey整合的最新技术水平自2008年以来一直停滞不前,似乎两支球队都陷入了僵局.问题的关键在于JAX-RS注释执行字段和方法注入,这与Guice自己的依赖注入不能很好地协作.
我发现的一些例子远远不足以阐明:
Iqbalyusuf 在Google App Engine上发布关于Jersey + Guice的帖子Java遭受了大量的样板(手动获取和调用注入器).我希望绑定和注入应该通过Guice注释在幕后发生.
Jonathan Curran的文章使用Jersey,Guice和JSR-250创建一个RESTful服务给了我希望,因为它更新(2010),但没有比显示如何在Guice ServletModule中启动Jersey服务更进一步.但是,没有任何实例依赖注入的例子.我想这是留给读者的练习.Curran的帖子实际上可能是连接Guice和Jersey的正确的第一步,所以我打算从那开始.
令人着迷的詹姆斯斯特拉坎写道:
JAX-RS适用于依赖注入框架,如Spring,Guice,GuiceyFruit或JBossMC - 你基本上可以选择你喜欢的任何一个.
但是,从实践者的角度来看,我没有看到任何证据.
我发现缺少的是关于如何组合JAX-RS和Guice注释的实际示例和解释.例如:
有没有人有一些非平凡的应用程序的例子,最好是源代码,它结合了Jersey和Guice,而不会在这个过程中牺牲一个或另一个?无论如何我都会坚持这条道路,但泽西和吉斯的名单上的点点滴滴让我觉得我正在重复在我面前的其他人的工作.
Jersey通常使用HK2依赖注入,但我想使用Jersey和Dagger 2.Dagger和HK2都实现了JSR 330,我已经把它作为证据证明这应该是可能的而不需要太多努力.我找到了使泽西与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();
}
}
Run Code Online (Sandbox Code Playgroud)
并且Dagger组件可以例如定义如下:
@Component
public interface Application {
public ExampleResource exampleEndpoint();
public XyzResource xyzEndpoint();
// etc.
}
Run Code Online (Sandbox Code Playgroud)
这样主要方法看起来类似于:
public final class Main {
public static void main(final String[] args) {
final Application application = DaggerApplication.create();
final URI baseUri = …Run Code Online (Sandbox Code Playgroud) 我一直在寻找,但似乎无法找到一个明确的答案......
服务器(我的问题的玻璃鱼)注入用@Context注释的实际objets的机制是什么?更具体地说,如果我想编写一个类似于以下内容的类:
@Path("/")
public class MyResource {
@GET
public String doSomething(@Context MyObject obj) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
那我该怎么办?MyObject在哪里实现,谁在实现它,以及如何实现?
编辑:我见过以下内容:
在JAX-RS中使用@ Context,@ Extider和ContextResolver
http://jersey.576304.n2.nabble.com/ContextResolver-confusion-td5654154.html
但是,这与我所看到的不一致,例如在org.neo4j.server.rest.web.RestfulGraphDatabase的构造函数中,它具有以下签名:
public RestfulGraphDatabase(
@Context UriInfo uriInfo,
@Context Database database,
@Context InputFormat input,
@Context OutputFormat output,
@Context LeaseManager leaseManager )
Run Code Online (Sandbox Code Playgroud)