Java 如何使用Jersey';资源构造函数中的s@QueryParam和Guice注入?
我试图在资源构造函数中同时使用Jersey的Java 如何使用Jersey';资源构造函数中的s@QueryParam和Guice注入?,java,jersey,guice,Java,Jersey,Guice,我试图在资源构造函数中同时使用Jersey的@QueryParam和Guice的@Inject。从网上看,我以前也问过类似的问题: 这似乎是不可能的。然而,这些问题已经有好几年的历史了,所以我现在想做的是可能的吗 以下是我尝试做的一些代码作为示例: @Path("/mypath") public class MyResource { private Manager manager; private String type; @Inject public MyResource
@QueryParam
和Guice的@Inject
。从网上看,我以前也问过类似的问题:这似乎是不可能的。然而,这些问题已经有好几年的历史了,所以我现在想做的是可能的吗 以下是我尝试做的一些代码作为示例:
@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);
}
}
谢谢 这对我很管用。可能是与球衣和Guice的正确绑定有关的问题 我用您的资源定义和一些样板代码创建了一个最小的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));
}
}
这是Java8语法,但如果您不使用Java8,它很容易转换为lambda之前的代码。我创建了一个只包含一个绑定的Guice注入器
管理器
和实现类非常简单
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);
}
}
这没有道理
MyResource
是一个单例,处理所有请求。在构建时没有请求,因此也就没有@QueryParam
@LanceJava如果您删除Guice@Inject
东西,它就会工作。您可以随请求传入一个查询参数,构造函数会将其设置为您传入的任何参数。好的,我自己不是Jersey用户。SpringMVCETC使用单例而不是每请求事件处理程序。我只能假设你需要以某种方式将guice插入Jersey注射器