Grizzly和ServletContainerContext

问题描述 投票:8回答:4

我正在尝试在我编写的在Grizzly上运行的Servlet中掌握一些注入的上下文(例如Session或HttpServletRequest),但我似乎无济于事。整个过程似乎因以下错误而过早地停顿:

SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr

服务器非常简单,它包含两个文件,静态入口点(Main.java):

package com.test.server;

import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;

import org.glassfish.grizzly.http.server.HttpServer;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;

public class Main {

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost/").port(8080).build();
    }

    public static final URI BASE_URI = getBaseURI();

    public static void main(String[] args) throws IOException {
        ResourceConfig rc = new ClassNamesResourceConfig(LolCat.class);
        HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
        System.in.read();
        httpServer.stop();
    }
}

和Serlvet(LolCat.java):

package com.test.server;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;

@Path(value = "/lol")
public class LolCat {

    @Context HttpServletRequest hsr;

    @GET
    @Path(value="/cat")
    public String list() {
        return "meow";
    }

}

特别是,上述源文件中的@ Context-line是我所有问题的来源和解决方案。我需要它,并且根据我所读到的有关Jersey和Servlet的所有内容,它应该可以工作,但是可惜没有。我也尝试过使用GrizzlyWebContainerFactory代替GrizzlyServerFactory,但无济于事。

供参考,使用以下依赖项编译项目:

  • org.glassfish.grizzly:grizzly-framework:jar:2.2.21
  • org.glassfish.grizzly:grizzly-http:jar:2.2.21
  • org.glassfish.grizzly:grizzly-http-servlet:jar:2.2.21
  • org.glassfish.grizzly:grizzly-http-server:jar:2.2.21
  • com.sun.jersey:jersey-server:jar:1.17
  • com.sun.jersey:jersey-servlet:jar:1.17
  • com.sun.jersey:jersey-core:jar:1.17
  • javax.servlet:javax.servlet-api:jar:2.5.0
  • com.sun.jersey:jersey-grizzly2:jar:1.17
  • com.sun.jersey:jersey-grizzly2-servlet:jar:1.17
  • asm:asm:jar:3.3.1
java servlets jersey grizzly
4个回答
4
投票

此主类对我来说效果很好:

package com.test.server;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;

import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import org.glassfish.grizzly.http.server.HttpHandler;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.servlet.ServletRegistration;
import org.glassfish.grizzly.servlet.WebappContext;

public class Main {
    private static final String JERSEY_SERVLET_CONTEXT_PATH = "";

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost").port(8080).path("/").build();
    }

    public static final URI BASE_URI = getBaseURI();

    public static void main(String[] args) throws IOException {
        // Create HttpServer and register dummy "not found" HttpHandler
        HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, new HttpHandler() {

            @Override
            public void service(Request rqst, Response rspns) throws Exception {
                rspns.setStatus(404, "Not found");
                rspns.getWriter().write("404: not found");
            }
        });

        // Initialize and register Jersey Servlet
        WebappContext context = new WebappContext("WebappContext", JERSEY_SERVLET_CONTEXT_PATH);
        ServletRegistration registration = context.addServlet("ServletContainer", ServletContainer.class);
        registration.setInitParameter(ServletContainer.RESOURCE_CONFIG_CLASS, 
                ClassNamesResourceConfig.class.getName());
        registration.setInitParameter(ClassNamesResourceConfig.PROPERTY_CLASSNAMES, LolCat.class.getName());
        registration.addMapping("/*");
        context.deploy(httpServer);

        System.in.read();
        httpServer.stop();
    }
}

在浏览器中尝试http://localhost:8080/lol/cat。您可以更改JERSEY_SERVLET_CONTEXT_PATH来更新Servlet的上下文路径。


4
投票

根据开发人员的解释-Grizzly不完全符合JAX-RS 2.0,因此不会有正式的上下文注入/包装。见Jersey Bug-1960适用于Jersey + Grizzly版本2.7 +

幸运的是,有一种方法可以注入Grizzly请求/响应对象。有点棘手但有效Jersey的单元测试之一中提供的代码示例。参见Jersey container test

所以代码片段将是:

import javax.inject.Inject;
import javax.inject.Provider;

public someclass {
    @Inject
    private Provider<Request> grizzlyRequestProvider;

    public void method() {
         if (grizzlyRequestProvider != null) {
            Request httpRequest = grizzlyRequestProvider.get();

            // Extract what you need
         }
    }
}

同时适用于过滤器和服务方法


2
投票

您也可以手动注册ResourceContext

  HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI());

  WebappContext context = new WebappContext("WebappContext", "/api");
  ServletRegistration registration = context.addServlet("ServletContainer",
    new ServletContainer(config));
  registration.addMapping("/*");
  context.deploy(httpServer);

其中config是您的资源上下文。


0
投票

尝试这样的事情:-

public class Main {

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost/").port(8080).build();
    }

    public static void main(String[] args) throws IOException {
        ResourceConfig rc = new ResourceConfig().packages("com.example");//path to you class files
        HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc);
        System.in.read();
        httpServer.stop();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.