具有Jersey JsonBindingException的Genson:无法反序列化以键入类java.lang.String

问题描述 投票:1回答:2

在我的Spring MVC Java应用程序中,我正在使用Jersey REST API。我正在使用Jackson进行JSON处理。我在项目中添加了[[Genson,以过滤某些类的某些字段。我只想为此使用Genson,而其余的我想使用Jackson。

但是当Jar位于类路径(Got to know from this link)中时,默认情况下使用Jersey启用的Genson时,在使用Jersey REST api时出现异常,

这是我的代码,用于连接Web服务并获取数据并使用Jackson转换为String

public String connect() throws Exception { Client client = Client.create(); try { String auth = new String(Base64.encode(userName + COLON + password)); WebResource webResource = client .resource(webServiceUrl); ClientResponse response = webResource .header(AUTHORIZATION, BASIC + auth).type(APPLICATION_JSON) .accept(APPLICATION_JSON).get(ClientResponse.class); //code to check response status code. stringResponse = response.getEntity(String.class); } catch (ClientHandlerException e) { throw new Exception("Not a Valid Url."); } finally { client.destroy(); } return stringResponse; }

我正在跟踪异常

javax.ws.rs.WebApplicationException: com.owlike.genson.JsonBindingException: Could not deserialize to type class java.lang.String at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:130) at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553) at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:506) at com.myapp.WebHttpClient.connect(WebHttpClient.java:74) at com.myapp.connection.connectors.WebConnector.getData(WebConnector.java:39) at com.myapp.adapter.impl.SourceAdapter.getData(SourceAdapter.java:29) at com.myapp.service.impl.WebServiceImpl.adapter(WebServiceImpl.java:174) at com.myapp.service.impl.WebServiceImpl.connect(WebServiceImpl.java:107) ... 41 more Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to type class java.lang.String at com.owlike.genson.Genson.deserialize(Genson.java:398) at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:128) ... 48 more Caused by: com.owlike.genson.stream.JsonStreamException: Readen value can not be converted to String at com.owlike.genson.stream.JsonReader.valueAsString(JsonReader.java:200) at com.owlike.genson.convert.DefaultConverters$StringConverter.deserialize(DefaultConverters.java:364) at com.owlike.genson.convert.DefaultConverters$StringConverter.deserialize(DefaultConverters.java:351) at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56) at com.owlike.genson.Genson.deserialize(Genson.java:396) ... 49 more

第74行指的是stringResponse = response.getEntity(String.class);

如何禁用Genson for Jersey或如何使用Genson解决此问题?

谢谢

java jersey jersey-client genson
2个回答
4
投票
Genson的最新文档位于github http://owlike.github.io/genson/

实际发生的事情

对我来说,尚不清楚您想在哪里使用Genson以及如何使用。您是否仅使用Genson进行序列化?您是通过球衣还是直接使用它?

[当您执行getEntity(String.class)时,Jersey要求Genson将传入的json解串为字符串。请注意,一般json格式不允许将字符串作为根值。

解决方案

  1. 升级到jersey 2.X(和最新的Genson版本),在新泽西州的新版本中,当您要求输入为字符串时,它不委托给MessageBodyReader(正确的行为IMO)。然后,您可以使用该字符串将其设置为所需的任何类型。
  2. 使用ClientResponse中的getEntityInputStream方法获取原始InputStream并将其转换为字符串。
  3. 另一个解决方案是重写GenBons的MessageBodyReader实现,而不处理对String的请求。


具有多个同时处理JSON转换的库对我来说听起来并不正确。特别是因为两者(杰克逊和杰森)都提供了一些相似的功能。我打开了an issue,允许人们在JAX-RS应用程序中禁用Genson。

更新

Genson 1.3及更高版本为disable Genson in a Jax-RS应用提供了一个系统。

0
投票
这里是解决方案2的示例...

使用ClientResponse中的getEntityInputStream方法获取原始InputStream并将其转换为字符串:

private String responseString(ClientResponse response) { InputStream stream = response.getEntityInputStream(); StringBuilder textBuilder = new StringBuilder(); try (Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName(StandardCharsets.UTF_8.name())))) { int c = 0; while ((c = reader.read()) != -1) { textBuilder.append((char) c); } return textBuilder.toString(); } catch (IOException e) { e.printStackTrace(); return null; } }

© www.soinside.com 2019 - 2024. All rights reserved.