use*_*803 20 rest json jax-rs resteasy jackson
我正在使用带有jackson提供程序的RestEasy客户端并收到上述错误
客户端代码是:
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())));
Run Code Online (Sandbox Code Playgroud)
response.getEntity()
正在抛出ClientResponseFailure
异常,错误是
Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String
Run Code Online (Sandbox Code Playgroud)
我的服务器端代码如下:
@GET
@Path("/{itemId}")
@Produces(MediaType.APPLICATION_JSON)
public String item(@PathParam("itemId") String itemId) {
//custom code
return gson.toJSON(object);
}
Run Code Online (Sandbox Code Playgroud)
小智 53
您可以尝试将以下依赖项添加到您的maven pom中.
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.3.4.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
问题实际上是RestEasy无法找到Jackson提供商.我不得不通过以下代码手动注册它:
ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance();
RegisterBuiltin.register(instance);
instance.registerProvider(ResteasyJacksonProvider.class);
Run Code Online (Sandbox Code Playgroud)
这一切都很好.但我对解决方案仍然不满意,因为Resteasy应该扫描提供商并自动注册.
小智 5
Client client = ClientBuilder.newBuilder().register(ResteasyJacksonProvider.class).build();
Run Code Online (Sandbox Code Playgroud)
我不知道其背后的全部原理,但我们遇到了完全相同的问题(多次:P),您需要将 MediaType 更改为TEXT_PLAIN
.
或者,您也可以让 JAX-RS 为您完成这项工作:只需返回 object 并将方法签名更改为任何类,而不是执行 gson.toJSON(object) 。JAX-RS(在您的情况下为 RESTEasy)将自动调用 Jackson(如果配置正确)并将您的对象序列化为 json。然后在您的客户端,您将请求相同的类而不是 String,并且所有内容都应该自行运行。我对 ClientRequest/Response 不是特别熟悉,所以它可能不会像我说的那样工作;我们在客户端使用 RESTEasy 代理功能(请参阅 参考资料ProxyFactory
)。尽管如此,JAX-RS/RESTEasy 也可以在客户端自动进行 json 序列化/反序列化,所以肯定有一种方法。
归档时间: |
|
查看次数: |
38465 次 |
最近记录: |