8

我试图在我编写的在 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 和 Servlets 的所有内容,它应该可以工作,但可惜它没有。我也尝试过使用 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
4

4 回答 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 的上下文路径。

于 2013-04-04T08:12:08.647 回答
4

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

幸运的是,有一种方法可以注入 Grizzly 请求/响应对象。泽西的一个单元测试中提供了一种棘手但有效的代码示例。见泽西容器测试

所以代码片段将是:

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
         }
    }
}

适用于过滤器和服务方法

于 2014-05-09T13:10:47.780 回答
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 是您的资源上下文。

于 2016-01-06T02:40:58.150 回答
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();
    }
}
于 2020-01-04T19:38:21.187 回答