我在Web服务器上有一个端点,它返回字符串文字true
或false
以及Content-Type: application/json
标题。我试图编写一个访问此端点的Jersey客户端,并将响应转换为简单的Boolean
。
我的代码的相关部分看起来像这样:
WebResource queryResource = client.resource("http://path.to/my/endpoint");
WebResource.Builder queryBuilder = queryResource.getRequestBuilder();
queryBuilder.addHeader("Authorization", "Bearer 1234...");
Boolean result = queryBuilder.get(new GenericType<Boolean>(){});
不幸的是,当客户端尝试处理请求时,我最终得到ClientHandlerException
,其中包含:
Java类java.lang.Boolean的消息体读取器,Java类型类java.lang.Boolean和MIME媒体类型application / json; charset =未找到UTF-8
日志中的更多细节也强调了这一点:
The registered message body readers compatible with the MIME media type are:
application/json; charset=UTF-8 ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
我最好的猜测是,我需要添加一些可以明确处理@Provider
到application/json
转换的自定义Boolean
类。但是,我对此非常陌生,之前从未写过提供商。我看到了一些扩展JacksonJsonProvider
的人的例子,但是用于其他用途。有人可以告诉我该怎么做,或者指出我如何编写这个提供者的一些资源? (而且,我如何将它添加到我的Jersey客户端?)
答案 0 :(得分:0)
您需要为MessageBodyReader
类型添加application/json
。
您可以通过将 Jersey Media Json Jackson 库添加到项目中来轻松解决此问题。如果您使用maven将以下依赖项添加到pom.xml
:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
修改强>
不需要实现自定义MessageBodyReader
或添加库的最简单的解决方案是从响应中手动读取数据作为字符串,然后将其转换为boolean
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target("http://path.to/my/endpoint");
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.get();
Boolean result = Boolean.valueOf(response.readEntity(String.class));
答案 1 :(得分:0)
响应不是有效的json字符串:ether发送一个内容类型是application / json你应该收到一个有效的json字符串并捕获一些DTO类(或javax.json.JsonObject):
e.g。 {"flag": true}.
或者您必须将内容类型更改为text / plain。