分析了整个互联网,但无法弄清楚为什么会发生这种情况。我有一个最简单的项目(使用jersey-quickstart-
grizzly2原型),并且只有一个Jersey资源。我将Guice用作DI,因为CDI也不想与Jersey合作。问题在于,Guice在注入Jersey的资源时无法解析要使用的类。它在外面很好用,但不适用于泽西岛。这是泽西岛的资源:
import com.google.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("api")
public class MyResource {
private Transport transport;
@Inject
public void setTransport(Transport transport) {
this.transport = transport;
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return transport.encode("Got it!");
}
}
传输接口:
public interface Transport {
String encode(String input);
}
它的实现:
public class TransportImpl implements Transport {
@Override
public String encode(String input) {
return "before:".concat(input).concat(":after");
}
}
遵循Google的Getting Started手册,我继承AbstractModule
并绑定了我的类,如下所示:
public class TransportModule extends AbstractModule {
@Override
protected void configure() {
bind(Transport.class).to(TransportImpl.class);
}
}
我可以使用喷油器main()
,但是在这里并不需要它:
Injector injector = Guice.createInjector(new TransportModule());
顺便说一句,当我尝试这样做时没有问题:
Transport transport = injector.getInstance(Transport.class);
泽西岛2已经拥有一个DI框架HK2。您可以使用它,也可以根据需要使用HK2 /
Guice桥将您的Guice模块与HK2连接起来。
如果您想使用HK2,那么从最基本的角度来说,它与Guice模块没什么不同。例如,在您当前的代码中,您可以执行此操作
public class Binder extends AbstractBinder {
@Override
public void configurer() {
bind(TransportImpl.class).to(Transport.class);
}
}
然后只需在泽西岛注册活页夹
new ResourceConfig().register(new Binder());
区别之一是绑定声明。在Guice中,它“将合同绑定到实施”,而在HK2中,它“将实施绑定到合同”。您可以看到它与Guice模块相反。
如果您想桥接Guice和HK2,则要复杂一些。您需要了解有关HK2的更多信息。这是一个如何使其工作的示例
@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 TransportModule());
GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(injector);
return true;
}
}
然后注册功能
new ResourceConfig().register(new GuiceFeature());
就个人而言,如果您要使用Jersey,我建议您熟悉HK2。
也可以看看:
抱歉,我忘了补充说明,以使用Guice Bridge,您需要依赖。
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>guice-bridge</artifactId>
<version>2.4.0-b31</version>
</dependency>
请注意,这是Jersey 2.22.1附带的依赖项。如果您使用的是HK2的其他版本,则应确保使用与Jersey版本相同的HK2版本。
我决定在这部分替换Web.XML: 我指向servlet容器Jersey,它将接受对REST-Controllers的请求,表明在启动时有必要扫描路径com . skillsimprover . REST examples . REST上的包REST,并表明资源的所有方法和类的基URI都填充了/api/* 从 JAX-RS 2.x 版本开始,可以使用应用程序类或资源配置类来注册包和资源。 我执行了
我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并
我有一个资源类 我尝试了泽西岛2.0的依赖注入中的答案 如果我使用 启动服务器时,我得到 如果我删除了上述依赖项,那么我得到 资源配置类是 活页夹类是 我在嵌入式模式下使用tomcat并添加init参数 我如何在控制器中注入服务?注入是单元测试的首选方式吗(当服务实现调用另一个服务时,比如说XService ),单元测试不应该依赖于Xservice,因此demoServiceImpl如何从测试中将
问题内容: 我的问题是:为什么在创建部署在某种servlet容器(如jetty或tomcat)上的应用程序时执行JavaSE应用程序和ServletModule时需要创建AbstractModule?它们之间有什么区别? 我需要将Jersey与Guice集成在一起。是否需要注册Guice的存在才能以某种方式使用它?我是否可以仅启用注入并在我想要的任何地方(常规类,过滤器,处理程序,服务,DAO等)
我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource
我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?