我试图在资源构造函数中一起使用Jersey的@QueryParam
和Guice的@Inject
。通过网络浏览,我之前遇到了类似的问题:
How can I mix Guice and Jersey injection?
http://users.jersey.dev.java.narkive.com/zlGMXuBe/can-queryparam-be-used-in-resource-constructor-along-with-guice-injection
似乎不可能。但是,这些问题已有几年的历史了,我现在正在尝试做什么呢?
以下是我正在尝试做的一些代码:
@Path("/mypath")
public class MyResource {
private Manager manager;
private String type;
@Inject
public MyResource(Manager manager,
@QueryParam("type") String type) {
this.manager = manager;
this.type = type;
}
@GET
@Produces("text/plan")
@Path("/{period}")
public String myMethod(@PathParam("period") String period) {
return manager.foo(period, type);
}
}
谢谢!
答案 0 :(得分:1)
它对我有用。也许是与泽西和吉斯的正确绑定有关的问题。
我使用您的资源定义和一些样板代码创建了一个最小的Web应用程序。
首先是应用初始化:
@WebListener
@Singleton
public class AppContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
new GuiceBootstrap().contextInitialized(sce);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// no op
}
}
你可以在那里看到我在那里初始化Guice。这是Guice代码。
public class GuiceBootstrap extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector((Module) binder -> binder.bind(Manager.class)
.to(ManagerImpl.class));
}
}
它是Java 8语法,但如果您不使用Java 8,它很容易转换为pre-lambda代码。我只用一个绑定创建一个Guice注入器。
Manager
和实现类非常简单。
public interface Manager {
String foo(String period, String type);
}
public class ManagerImpl implements Manager {
@Override
public String foo(String period, String type) {
return "Got " + period + " " + type;
}
}
最后是初始化Jersey并将其内部注入器(HK2)绑定到Guice的代码。
@ApplicationPath("api")
public class ApiRest extends ResourceConfig {
@Inject
public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
packages("net.sargue.so38531044");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new RuntimeException("Guice Injector not found");
guiceBridge.bridgeGuiceInjector(injector);
}
}