HK2 没有用球衣注入 HttpServletRequest

Chr*_*haw 4 java dependency-injection jersey jersey-2.0 hk2

我试图按照此处的示例创建一个工厂,以便注入我的 HttpSession。不幸的是,无论我尝试什么,它都不起作用。不确定可能是什么问题。

我尝试仅注入 HttpServletRequest 和提供程序。这是我使用提供商的示例。该错误是尝试在提供方法中访问提供程序时出现空指针异常。如果我尝试注入 HttpServletRequest,则没有可用于注入的对象。我使用 JerseyTest 在 GrizzlyTestContainer 内运行它。为了绑定 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 5

您应该@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 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你是我新最好的朋友!!!这让我濒临疯狂。我能够注册我的模块,一切都很高兴。再次感谢。 (2认同)