2011-12-29 19 views
11

Tôi có một ứng dụng đơn giản của Spring & Jersey, hoạt động hoàn hảo tốt cho các yêu cầu tiêu thụ thông qua một Tài nguyên đơn giản. Tuy nhiên, tôi muốn trả về một phản hồi JSON - chứa một tuần tự JSON đơn giản của một đối tượng. Để đạt được điều này, tôi đã thêm một phụ thuộc maven cho jersey-json. Tuy nhiên, ngay sau khi tôi thêm sự phụ thuộc này, tôi nhận được lỗi này khi khởi động máy chủ:Jersey Không có nhà cung cấp Ứng dụng Web nào hiện diện khi áo phụ thuộc * thêm

com.sun.jersey.api.container.ContainerException: No WebApplication provider is present at  
    com.sun.jersey.spi.container.WebApplicationFactory.createWebApplication(WebApplicationFactory.java:69) at 
    com.sun.jersey.spi.container.servlet.ServletContainer.create(ServletContainer.java:391) 

Tôi không rõ ràng chính xác nhà cung cấp là gì, nhưng tôi chắc chắn rằng phải có mặc định người ta tìm thấy.

Để hoàn chỉnh, đây là tài nguyên của tôi:

@Path("/scan") 
@Resource 
@Component 
public class ScanResource { 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("/{barcode}") 
    public List<Scan> getScansForBarcode(@PathParam("barcode") Long barcode){ 
     ..snip.. 
     return results; 
    } 
} 

đối tượng A Scan là một đối tượng Entity Bean đơn giản.

Các phụ thuộc mvn là:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.11</version> 
</dependency> 

Có ai biết tại sao tôi có thể nhận được các No WebApplication provider is present ngoại lệ? Bất kỳ suy nghĩ về cách tôi có thể giải quyết nó?

Cảm ơn

+0

bạn có chắc rằng bạn có jersey-server trên classpath không? Hãy nhớ rằng, tất cả các mô-đun áo phải có cùng phiên bản chính xác - chúng sẽ không thể tìm thấy các nhà cung cấp khác nếu điều kiện này không được đáp ứng. –

+0

Cảm ơn Pavel - hãy tiếp tục và đưa ra nhận xét này một câu trả lời, và tôi sẽ chấp nhận nó. – idbentley

+0

đã hoàn tất, cảm ơn! :) –

Trả lời

23

Bạn cũng cần có thùng máy chủ trên đường dẫn lớp của mình. Và bạn cần phải chắc chắn rằng tất cả các lọ của bạn là từ cùng một phiên bản, thời gian chạy Jersey sẽ không thể sử dụng các lớp được cung cấp khác.

Ngoài ra (hầu như không có liên quan ở đây, nhưng ..) có sự thay đổi gần đây về cấu trúc mô-đun - phụ thuộc servlet được tách thành mô-đun mới. Vì vậy, nếu bạn đang sử dụng servlet, bạn có thể muốn phụ thuộc vào jersey-servlet (phụ thuộc vào jersey-server).

+2

Cảm ơn bạn! Tôi đã có điều này với máy chủ neo4j nhúng, mà đã phá vỡ khi tôi thêm một phụ thuộc trong đó bao gồm một khách hàng json. Ví dụ - http://lists.neo4j.org/pipermail/user/2011-November/013368.html – Stewart

+0

Bên cạnh đó, jersey-servlet 1,17 cũng có cùng một vấn đề. Sử dụng 1.17.1 để thay thế. –

6

Tôi cũng gặp sự cố này. Vấn đề đã được giải quyết bằng cách có cùng một phiên bản cho phụ thuộc maven "jersey-json" và "jersey-servlet".

EX:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.13</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-servlet</artifactId> 
    <version>1.13</version> 
</dependency> 
+0

Sử dụng jersey-servlet là đủ cho trường hợp của tôi, không cần jersey-json. – Tires

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