2012-08-29 34 views
18

Tôi đang sử dụng RestEasy khách hàng với nhà cung cấp jackson và nhận được báo lỗi trênKhông thể tìm thấy một MessageBodyReader của content-type application/json và kiểu lớp java.lang.String

đang clientside là:

ClientRequest request = new ClientRequest(url); 
request.accept(MediaType.APPLICATION_JSON); 
ClientResponse<String> response = request.get(String.class); 

if (response.getStatus() != 200) { 
    throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); 
} 

BufferedReader br = 
    new BufferedReader(new InputStreamReader(new ByteArrayInputStream(response.getEntity().getBytes()))); 

response.getEntity() được ném ClientResponseFailure ngoại lệ với sai số là

Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String 

mã phía máy chủ của tôi là dưới đây:

@GET 
@Path("/{itemId}") 
@Produces(MediaType.APPLICATION_JSON) 
public String item(@PathParam("itemId") String itemId) { 
    //custom code 

    return gson.toJSON(object); 
} 

Trả lời

0

Tôi không biết lý do đầy đủ đằng sau điều đó nhưng chúng tôi đã gặp vấn đề tương tự (nhiều lần: P) và bạn cần thay đổi MediaType thành TEXT_PLAIN. Hoặc bạn cũng có thể cho phép JAX-RS thực hiện công việc cho bạn: thay vì làm gson.toJSON (đối tượng), chỉ cần trả về đối tượng và thay đổi chữ ký phương thức của bạn thành bất kỳ lớp nào. JAX-RS (RESTEasy trong trường hợp của bạn) sẽ tự động gọi Jackson (nếu nó được cấu hình đúng) và tuần tự hóa đối tượng của bạn thành json. Sau đó, về phía khách hàng của bạn, bạn sẽ yêu cầu cho cùng một lớp thay vì String và tất cả mọi thứ nên làm việc trên riêng của mình. Tôi không quen thuộc với ClientRequest/Response vì vậy nó có thể không hoạt động như tôi đã nói; chúng tôi sử dụng chức năng proxy RESTEasy ở phía máy khách thay thế (xem ProxyFactory). Tuy nhiên, JAX-RS/RESTEasy có thể làm json serialize/deserialize tự động ở phía máy khách để có một cách chắc chắn.

+0

Tôi đã làm cho nó hoạt động bằng cách đăng ký ResteasyJacksonProvider một cách rõ ràng. RestEasy đã được yêu cầu làm điều này một mình, nhưng tôi không biết tại sao nó không phải là đăng ký các nhà cung cấp. Tôi đang sử dụng Resteasy với mùa xuân. ResteasyProviderFactory instance = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register (ví dụ); instance.registerProvider (ResteasyJacksonProvider.class); – user1632803

0

Nếu bạn thực sự muốn vượt qua sự tốt đẹp của JAX-RS thực sự đang tuần tự hóa cho bạn (thay vì gọi GSON theo cách thủ công), hãy sử dụng StreamingOutput (tức là kết xuất bọc là StreamingOutput, trả lại đối tượng đó).

6

Vấn đề thực sự là RestEasy không thể tìm thấy nhà cung cấp Jackson. Tôi phải đăng ký theo cách thủ công bằng mã sau:

ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance(); 
    RegisterBuiltin.register(instance); 
    instance.registerProvider(ResteasyJacksonProvider.class); 

Mọi thứ đều hoạt động tốt với điều này. Nhưng tôi vẫn không hài lòng với giải pháp như Resteasy là vụ phải quét cho các nhà cung cấp và đăng ký chúng tự động.

+0

Tôi cập nhật thư viện an toàn, jaxrs, thư giãn, thư viện jackson mới nhất và nhận chúng hoạt động liền mạch – user1632803

+0

Bạn cũng có thể đăng ký nhà cung cấp theo cách khai báo từ components.xml: – tkotisis

+1

RESTeasy thực hiện một số lớp động. Ngữ cảnh OSGi, nơi các lớp cần thiết có thể không được tìm thấy bởi trình nạp lớp OSGi. Trong trường hợp này, việc thêm các lớp cần thiết theo cách thủ công có ý nghĩa. – Gregor

47

Bạn có thể thử thêm phụ thuộc sau vào pom maven của mình.

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jackson-provider</artifactId> 
    <version>2.3.4.Final</version> 
    </dependency> 
+0

Cảm ơn bạn! Điều này cũng giúp tôi. – sgoldberg

+0

cảm ơn nam giới, bạn đã giải quyết ngày của tôi – emoleumassi

+0

Lưu ý rằng nhà cung cấp dịch vụ an toàn-jackson [dường như không được chấp nhận] (http://docs.jboss.org/resteasy/docs/3.1.0.Final/javadocs/org/jboss/resteasy/plugins /providers/jackson/ResteasyJacksonProvider.html) và nhà cung cấp restsony-jackson2 đó là tạo phẩm mới. –

1

Chỉ cần thêm dòng org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider vào META-INF tập tin/dịch vụ/javax.ws.rs.ext.Providers, giải quyết vấn đề.

Tệp này được đưa vào resteasy-jackson-providers.jar nhưng cùng một tệp cũng được đưa vào jar khác, restasy-jaxrs.jar và tệp jar thực thi, sử dụng cả hai lọ này, chúng không được hợp nhất !!

+1

Cảm ơn, điều đó đã giúp tôi đi đúng hướng. Như một vấn đề của thực tế, nếu bạn kết hợp một số thành phần Java vào một JAR, các javax.ws.rs.ext.Providers khác nhau cũng cần được hợp nhất. Plugin bóng Gradle có ví dụ một hàm gọi là mergeServiceFiles, nhưng nó cũng được gọi một cách rõ ràng trong build.gradle: shadowJar { mergeServiceFiles() } – ocroquette

0

Tôi gặp sự cố tương tự và tôi nhận ra rằng sự cố có liên quan đến phiên bản resteasy-jackson-provider. Tôi vừa chuyển từ 3.0.4.Final sang 3.0.5.Final và sự cố đã biến mất.

Ngoài ra tôi cũng nhận ra rằng nếu tôi thay đổi dòng thứ ba thành kết quả sau đây là dự kiến ​​mà không cần thay đổi phụ thuộc.

Response response = request.get(Object.class).toString(); 
0

Những điều đó đã làm cho công việc mã của tôi đã chắc chắn rằng tôi đã thêm:

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jackson2-provider</artifactId> 
    <version>&{resteasy.version}</version> 
</dependency> 

Bên cạnh này, tôi không biết tại sao nhưng có vẻ như resteasy không khởi tạo các nhà cung cấp khi khách hàng đã được tạo ra, điều này có nghĩa rằng bắt buộc phải bắt đầu theo cách thủ công:

ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance(); 
RegisterBuiltin.register(instance); 
instance.registerProvider(ResteasyJackson2Provider.class); 

Nói chung đủ để chạy ứng dụng khách.

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