2013-04-02 21 views
7

Tôi đang cố gắng giữ một số ngữ cảnh được tiêm (ví dụ Session hoặc HttpServletRequest) trong Servlet mà tôi đã viết, chạy trên Grizzly, nhưng không có gì tôi làm dường như làm việc. Toàn bộ quá trình dường như chững lại khá sớm với các lỗi sau:Grizzly và ServletContainerContext

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

các máy chủ được chết đơn giản, nó bao gồm hai tập tin, điểm vào tĩnh (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(); 
    } 
} 

và the 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"; 
    } 

} 

Cụ thể, đó là @ Ngữ cảnh trong tệp nguồn ở trên là nguồn và giải pháp cho tất cả các vấn đề của tôi. Tôi cần nó, và theo tất cả những gì tôi đã đọc về Jersey và Servlets thì nó sẽ hoạt động, nhưng không phải vậy. Tôi cũng đã cố gắng sử dụng GrizzlyWebContainerFactory thay vì GrizzlyServerFactory, nhưng vô ích.

Để tham khảo, dự án được biên soạn với sự phụ thuộc sau:

  • org.glassfish.grizzly: xám-framework: jar: 2.2.21
  • org.glassfish.grizzly: xám-http: jar: 2.2.21
  • org.glassfish.grizzly: xám-http-servlet: jar: 2.2.21
  • org.glassfish.grizzly: xám-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

Trả lời

3

Lớp học chính này hoạt động tốt cho tôi:

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

Hãy thử http://localhost:8080/lol/cat trong trình duyệt của bạn. Bạn có thể thay đổi JERSEY_SERVLET_CONTEXT_PATH để cập nhật đường dẫn ngữ cảnh của Servlet.

+0

Nó hoạt động, với sự an toàn loại của văn bản thuần túy :). Có thể đăng ký một lớp mà không cần sử dụng String/String setInitParameter không? – Mic

+0

Tôi nghĩ rằng GrizzlyWebContainerFactory của Jersey có thể được mở rộng/cải thiện, do đó bạn sẽ không cần phải đối phó với các tham số init, nhưng dù sao nó sẽ là một wrapper trên cùng một mã đăng ký WebappContext. – alexey

+0

Trợ giúp! .. Mã của tôi nhận được như xa 'WebappContext context = new WebappContext (...' sau đó nó đột nhiên bị treo với 'Exception in thread" main "java.lang.NoSuchMethodError: org.glassfish.grizzly.utils.DataStructures. getConcurrentMap (IFI) Ljava/util/concurrent/ConcurrentMap; 'Đã thử với Java 7 và 8, sử dụng jersey-container-grizzly-http: 2.5 và jersey-container-grizzly2-servlet: 2.5 –

4

Theo giải thích của nhà phát triển - Grizzly không hoàn toàn tuân thủ JAX-RS 2.0 nên sẽ không có gói/gói ngữ cảnh chính thức nào. Xem Jersey Bug-1960 Áp dụng cho Jersey + Phiên bản Grizzly 2.7+

May mắn là có cách để tiêm các đối tượng yêu cầu/phản hồi Grizzly. Loại khó khăn nhưng hoạt động Mẫu mã được cung cấp trong một trong các bài kiểm tra đơn vị của Jersey.Xem Jersey container test

Vì vậy, đoạn mã sẽ là:

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

Hoạt động tốt cả cho các bộ lọc và phương pháp dịch vụ

1

Bạn cũng có thể tự đăng ký một 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); 

đâu cấu hình là tài nguyên của bạn bối cảnh.

Các vấn đề liên quan