Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jersey';资源构造函数中的s@QueryParam和Guice注入?_Java_Jersey_Guice - Fatal编程技术网

Java 如何使用Jersey';资源构造函数中的s@QueryParam和Guice注入?

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

我试图在资源构造函数中同时使用Jersey的
@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注射器