HK2 没有用 jersey 注入 HttpServletRequest
HK2 is not injecting the HttpServletRequest with jersey
我正在尝试按照位于 here 的示例创建工厂以注入我的 HttpSession。不幸的是,无论我尝试什么,它都不起作用。不确定可能是什么问题。
我试过只注入 HttpServletRequest 和一个提供者。这是我使用提供商的示例。该错误是尝试在 provide 方法中访问提供者时出现空指针异常。如果我尝试注入 HttpServletRequest,则没有可用于注入的对象。我在使用 JerseyTest 的 GrizzlyTestContainer 中 运行 this。为了绑定 HttpServletRequest,我需要添加一些东西到我的活页夹吗?我似乎找不到例子。
public class HttpSessionFactory implements Factory<HttpSession> {
private final HttpServletRequest request;
@Inject
public HttpSessionFactory(Provider<HttpServletRequest> requestProvider) {
this.request = requestProvider.get();
}
@Override
public HttpSession provide() {
return request.getSession();
}
@Override
public void dispose(HttpSession t) {
}
}
你应该@Override protected DeploymentContext configureDeployment()
在JerseyTest
到return一个ServletDeploymentContext
。例如
import javax.inject.Inject;
import javax.inject.Provider;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.ServletDeploymentContext;
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainerException;
import org.glassfish.jersey.test.spi.TestContainerFactory;
import org.junit.Test;
public class ServletTest extends JerseyTest {
@Path("/session")
public static class SessionResource {
@Inject
HttpSession session;
@GET
public Response getSessionId() {
return Response.ok(session.getId()).build();
}
}
public static class HttpSessionFactory implements Factory<HttpSession> {
private final HttpServletRequest request;
@Inject
public HttpSessionFactory(Provider<HttpServletRequest> requestProvider) {
this.request = requestProvider.get();
}
@Override
public HttpSession provide() {
return request.getSession();
}
@Override
public void dispose(HttpSession t) {
}
}
@Override
protected TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
@Override
protected DeploymentContext configureDeployment() {
ResourceConfig config = new ResourceConfig(SessionResource.class);
config.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(HttpSessionFactory.class).to(HttpSession.class);
}
});
return ServletDeploymentContext.forServlet(
new ServletContainer(config)).build();
}
@Test
public void test() {
System.out.println(target("session").request().get(String.class));
}
}
- 您可以在 source code tests
中查看更多示例
我正在尝试按照位于 here 的示例创建工厂以注入我的 HttpSession。不幸的是,无论我尝试什么,它都不起作用。不确定可能是什么问题。
我试过只注入 HttpServletRequest 和一个提供者。这是我使用提供商的示例。该错误是尝试在 provide 方法中访问提供者时出现空指针异常。如果我尝试注入 HttpServletRequest,则没有可用于注入的对象。我在使用 JerseyTest 的 GrizzlyTestContainer 中 运行 this。为了绑定 HttpServletRequest,我需要添加一些东西到我的活页夹吗?我似乎找不到例子。
public class HttpSessionFactory implements Factory<HttpSession> {
private final HttpServletRequest request;
@Inject
public HttpSessionFactory(Provider<HttpServletRequest> requestProvider) {
this.request = requestProvider.get();
}
@Override
public HttpSession provide() {
return request.getSession();
}
@Override
public void dispose(HttpSession t) {
}
}
你应该@Override protected DeploymentContext configureDeployment()
在JerseyTest
到return一个ServletDeploymentContext
。例如
import javax.inject.Inject;
import javax.inject.Provider;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.ServletDeploymentContext;
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainerException;
import org.glassfish.jersey.test.spi.TestContainerFactory;
import org.junit.Test;
public class ServletTest extends JerseyTest {
@Path("/session")
public static class SessionResource {
@Inject
HttpSession session;
@GET
public Response getSessionId() {
return Response.ok(session.getId()).build();
}
}
public static class HttpSessionFactory implements Factory<HttpSession> {
private final HttpServletRequest request;
@Inject
public HttpSessionFactory(Provider<HttpServletRequest> requestProvider) {
this.request = requestProvider.get();
}
@Override
public HttpSession provide() {
return request.getSession();
}
@Override
public void dispose(HttpSession t) {
}
}
@Override
protected TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
@Override
protected DeploymentContext configureDeployment() {
ResourceConfig config = new ResourceConfig(SessionResource.class);
config.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(HttpSessionFactory.class).to(HttpSession.class);
}
});
return ServletDeploymentContext.forServlet(
new ServletContainer(config)).build();
}
@Test
public void test() {
System.out.println(target("session").request().get(String.class));
}
}
- 您可以在 source code tests 中查看更多示例