Java Grizzly和ServletContainerContext

Java Grizzly和ServletContainerContext,java,servlets,jersey,grizzly,Java,Servlets,Jersey,Grizzly,我试图在我编写的一个Servlet中获得一些注入的上下文(例如Session或HttpServletRequest),运行在Grizzly上,但我所做的一切似乎都不起作用。整个过程似乎过早停止,出现以下错误: SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr 服务器非常简单,它由两个文件组成,静态入口点(Main.java): 和serlv

我试图在我编写的一个Servlet中获得一些注入的上下文(例如Session或HttpServletRequest),运行在Grizzly上,但我所做的一切似乎都不起作用。整个过程似乎过早停止,出现以下错误:

SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr
服务器非常简单,它由两个文件组成,静态入口点(Main.java):

和serlvet(LolCat.java):

具体来说,上面源文件中的@Context行是我所有问题的来源和解决方案。我需要它,根据我读到的关于Jersey和Servlets的所有信息,它应该可以工作,但可惜它不能。我也尝试过使用GrizzlyWebContainerFactory而不是GrizzlyServerFactory,但没有效果

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

  • grizzly:grizzly框架:jar:2.2.21
  • grizzly:grizzly http:jar:2.2.21
  • grizzly:grizzly http servlet:jar:2.2.21
  • grizzly:grizzly http服务器:jar:2.2.21
  • 泽西岛:泽西岛服务器:jar:1.17
  • jersey:jersey servlet:jar:1.17
  • jersey:jersey核心:jar:1.17
  • servlet:javax.servlet api:jar:2.5.0
  • jersey:jersey-grizzly2:jar:1.17
  • jersey:jersey-grizzly2-servlet:jar:1.17
  • asm:asm:jar:3.3.1

    • 这门主要课程对我来说很好:

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

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

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

      因此,代码片段将是:

      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
               }
          }
      }
      
      import javax.inject.inject;
      导入javax.inject.Provider;
      公共课{
      @注入
      私人提供商grizzlyRequestProvider;
      公开作废法(){
      if(grizzlyRequestProvider!=null){
      请求httpRequest=grizzlyRequestProvider.get();
      //提取你需要的东西
      }
      }
      }
      

      适用于筛选器和服务方法

      您还可以手动注册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是您的资源上下文

      试试这样的方法:-

      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();
          }
      }
      

      它工作正常,类型安全性为明文:)。不使用String/String setInitParameter是否可以注册一个类?我认为Jersey的GrizzlyWebContainerFactory可能会得到扩展/改进,这样您就不需要处理init参数,但无论如何,它将是同一WebappContext注册代码的包装器。帮助!。。我的代码一直到
      WebappContext context=new WebappContext(…
      然后它突然崩溃,线程“main”java.lang.NoSuchMethodError中出现
      异常:org.glassfish.grizzly.utils.DataStructures.getConcurrentMap(IFI)Ljava/util/concurrent/ConcurrentMap;
      。使用jersey容器grizzly http:2.5和jersey-container-grizzly2-servlet:2.5尝试了Java 7和Java 8,修复了我的问题。对于遇到此问题的任何人,我将.pom文件中的依赖项从
      org.glassfish.jersey.containersjersey-container-grizzly2-servlet
      。更改为..
      org.glassfish.grizzly grizzly http servlet
      …这让我毛骨悚然!!
        HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(getBaseURI());
      
        WebappContext context = new WebappContext("WebappContext", "/api");
        ServletRegistration registration = context.addServlet("ServletContainer",
          new ServletContainer(config));
        registration.addMapping("/*");
        context.deploy(httpServer);
      
      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();
          }
      }