2012-10-23 21 views
6

JunitTest'imin başında çalışan bir Bağımsız Jersey sunucum var. Benim JaxRS controller benim yanı sıra benim özel HttpClient çalışırsa, test ediyorum. Lütfen, bu JaxRsResourceController'ı her zaman glassfish'e gömdüğümü unutmayın.Jersey ile HttpServletRequest için eksik bağımlılıklar

GRAVE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.robustaweb.library.rest.controller.implementation.JaxRsResourceController.request 
    SEVERE: Missing dependency for field: javax.servlet.http.HttpServletResponse com.robustaweb.library.rest.controller.implementation.JaxRsResourceController.response 

    at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:172) 
    at com.robustaweb.library.rest.server.JerseyServer.startServer(JerseyServer.java:44) 

Temelde en söylüyor: Burada

JaxRsController (hafif versiyonu)

@Path("root") 
public class JaxRsResourceController implements 
     ResourceController<HttpServletRequest> { 

    @Context 
    private UriInfo context; 
    @Context 
    HttpServletRequest request; 
    @Context 
    HttpServletResponse response; 

    @GET 
    public String hello(){ 
     System.out.println("Uri is "+this.context.getBaseUri().toString()); 
     return "Hello "+peoples; 
    } 

} 

Ben müşteri ile bir sorunum yok, ama sunucuyu başlattığınızda, var olan @ Metin enjeksiyon zamanı, HttpServletRequest üzerinde bir bağımlılık yoktur. Ancak, istek ve yanıt üzerine @ Metin ek açıklamalarını kaldırırsam ancak UriInfo context için saklarsam, tamamdır ve Uri'yi okuyabilirim.

<dependencies> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>1.14</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>jsr311-api</artifactId> 
     <version>1.1.1</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.1</version> 
    </dependency> 
</dependencies> 

herhangi bir fikir:

Maven pom Fırkası kütüphanelerini zorlamak için şimdi bir kaç kez değişti?

cevap

1

Kolay değildi, ama öğrendim. şey benim JUnit testinde, böyle sunucusu oluşturma olmasıdır:

HttpServer server = HttpServerFactory.create(url); 

Ama bu şekilde, sen servlet konteynerleri yok hafif bir kabın oluşturmak ve böylece başarısızlık nedenidir. Bu yüzden hepsine sahip olmak için, Grizzly web kabını (hatta Gömülü camböceği) kullanmasına izin veren jersey-test-framework'ü kullandım. @GET içeren bu

public class JerseyServerTest extends JerseyTest { 

    protected String baseUri = "http://localhost:" + TestConstants.JERSEY_HTTP_PORT + "/"; 

    public JerseyServerTest() throws Exception { 
     super("com.robustaweb.library.rest.controller"); 

     /* 
     It's possible to NOT call the super() but to manually do : 
     1) ApplicationDescriptor appDescriptor = new ApplicationDescriptor() 
       .setRootResourcePackageName(resourcePackageName) // resource packages 
       .setContextPath(contextPath) //context of app 
       .setServletPath(servletPath); // context of spi servlet 
     2)setupTestEnvironment(appDescriptor); 
     */ 
    } 

    @Test 
    public void testHelloWorldRequest() { 
     SunRestClient client = new SunRestClient(baseUri + "root"); 
     String result = client.GET("", null); 
     System.out.println(result); 
    } 

    @Test 
    public void testDeleteRequest() { 
     SunRestClient client = new SunRestClient(baseUri + "root"); 
     String result = client.DELETE("john", null); 
     System.out.println(result); 
    } 
} 

Ve nihayet kaynak dosyası JerseyTest

uzanır unutmayın ve @DELETE

@Path("root") 
public class JaxRsController extends JaxRsResourceController{ 

    List<String> peoples = new ArrayList<String>(); 

    @GET 
    public String hello(){ 
     System.out.println("Uri is "+getUri()); 
     return "Hello "+peoples; 
    } 

    @DELETE 
    @Path("{name}") 
    public String deletePeople(@PathParam("name") String name){ 
     System.out.println("deleting "+name); 
     this.peoples.remove(name); 
     return String.valueOf(peoples.size()); 
    } 
} 
:

İşte
<dependencies> 
    <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>jsr311-api</artifactId> 
     <version>1.1.1</version> 
    </dependency> 
    <!-- Unit test are using jersey server directly -->   
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.1</version> 
     <scope>test</scope> 
    </dependency>   
    <dependency> 
     <groupId>com.sun.jersey.test.framework</groupId> 
     <artifactId>jersey-test-framework</artifactId> 
     <version>1.0.3</version> 
     <scope>test</scope> 
    </dependency>  
</dependencies> 

JerseyServerTest: İşte

maven olduğunu

Ve şimdi çalışıyor! this article numaralı telefondan yardım aldım ve bir small chapter on the documentation var. Jersey çerçevesinin kaynak kodunu bağlayabilen beeing, gerçekten de yardımcı oldu, bu yüzden IntelliJ'e de teşekkürler.

1

servlet bağımlılıkları başka modülüne ayrıldı, senin pom için

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-servlet</artifactId> 
    <version>1.14</version> 
</dependency> 

eklemeyi deneyin.

+0

Bu benim için iş yapmadı. İşte benim cevabım. –

İlgili konular