如何编写自定义Provider类以将JSON转换为Boolean?

时间:2017-12-11 02:39:59

标签: java json jackson jersey jax-rs

我在Web服务器上有一个端点,它返回字符串文字truefalse以及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

我最好的猜测是,我需要添加一些可以明确处理@Providerapplication/json转换的自定义Boolean类。但是,我对此非常陌生,之前从未写过提供商。我看到了一些扩展JacksonJsonProvider的人的例子,但是用于其他用途。有人可以告诉我该怎么做,或者指出我如何编写这个提供者的一些资源? (而且,我如何将它添加到我的Jersey客户端?)

2 个答案:

答案 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。