HK2没有注射带有运动衫的HttpServletRequest [英] HK2 is not injecting the HttpServletRequest with jersey
问题描述
我正在尝试以 here 为例创建一个工厂命令注入我的HttpSession。不幸的是,无论我尝试什么都不行。不知道可能是什么问题。
我尝试注入HttpServletRequest和提供者。这是我使用提供者的例子。在提供方法中尝试访问提供程序时,错误是空指针异常。如果我尝试注入HttpServletRequest,我没有可用的注入对象。我正在使用JerseyTest在GrizzlyTestContainer里面运行。为了绑定HttpServletRequest,有没有什么我需要添加到我的binder?我似乎找不到一个例子。
public class HttpSessionFactory实现Factory&HttpSession> {
pre>
private final HttpServletRequest请求;
@Inject
public HttpSessionFactory(Provider< HttpServletRequest> requestProvider){
this.request = requestProvider.get();
}
@Override
public HttpSession provide(){
return request.getSession();
}
@Override
public void dispose(HttpSession t){
}
}
解决方案您应该在$ code> @Override protected DeploymentContext configureDeployment()
JerseyTest
返回一个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会话;
@GET
public Response getSessionId(){
return Response.ok(session.getId())。build();
}
}
public static class HttpSessionFactory implements Factory< HttpSession> {
private final HttpServletRequest请求;
@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()。类));
}
}
- 您可以看到更多源代码测试
I am trying to follow the example located here to create a factory in order to inject my HttpSession. Unfortunately no matter what I try it is not working. Not sure what could be the issue.
I have tried injecting just the HttpServletRequest and a provider. Here is my example using a provider. The error is a null pointer exception when trying to access the provider in the provide method. If I try to inject the HttpServletRequest I get no object available for injection. I am running this inside the GrizzlyTestContainer using JerseyTest. Is there something I need to add to my binder in order to bind the HttpServletRequest? I cannot seem to find an example.
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) {
}
}
You should @Override protected DeploymentContext configureDeployment()
in the JerseyTest
to return a ServletDeploymentContext
. For example
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));
}
}
- You can see more examples in the source code tests
这篇关于HK2没有注射带有运动衫的HttpServletRequest的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!