带有 Jersey JsonBindingException 的 Genson:无法反序列化为类型 class java.lang.String
Genson with Jersey JsonBindingException: Could not deserialize to type class java.lang.String
在我的 Spring MVC Java 应用程序中,我使用的是 Jersey REST API。我正在使用 Jackson 进行 JSON 处理。我将 Genson 添加到我的项目中,用于为某些 类 过滤某些字段。我正在尝试仅为此使用 Genson,剩下的我想使用 Jackson。
但是我在使用 Jersey REST api 时出现异常,因为当 Jar 在类路径中时 Jersey 默认启用 Genson (Got to know from this link)。
这是我连接到 Web 服务并获取数据并使用 Jackson 转换为字符串的代码
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);
.
如何禁用 Jersey 的 Genson 或如何使用 Genson 解决此问题?
谢谢
Genson 的最新文档位于 github http://owlike.github.io/genson/。
实际发生了什么
我不清楚您想在哪里使用 Genson 以及如何使用。您是否仅将 Genson 用于序列化?你是通过球衣使用还是直接使用?
当您执行 getEntity(String.class) 时,Jersey 要求 Genson 将传入的 json 转换为字符串。请注意,通常 json 格式不允许字符串作为根值。
解决方案
升级到 jersey 2.X(以及最新的 Genson 版本),在新的 Jersey 版本中,当您将输入作为字符串询问时,它不会委托给 MessageBodyReader(IMO 的正确行为)。然后你就可以使用这个字符串去选择你想要的任何类型。
使用 ClientResponse 的 getEntityInputStream 方法获取原始 InputStream 并将其转换为字符串。
另一种解决方案是覆盖 MessageBodyReader 的 Gensons 实现,不处理字符串的 deser。
同时处理 JSON 转换的多个库对我来说听起来不合适。特别是两者(Jackson 和 Genson)都提供了一些相似的功能。我打开了 an issue 允许人们在 JAX-RS 应用程序中禁用 Genson。
更新 Genson 1.3 及更高版本为 disable Genson in a Jax-RS 应用程序提供系统。
这是解决方案 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;
}
}
在我的 Spring MVC Java 应用程序中,我使用的是 Jersey REST API。我正在使用 Jackson 进行 JSON 处理。我将 Genson 添加到我的项目中,用于为某些 类 过滤某些字段。我正在尝试仅为此使用 Genson,剩下的我想使用 Jackson。
但是我在使用 Jersey REST api 时出现异常,因为当 Jar 在类路径中时 Jersey 默认启用 Genson (Got to know from this link)。
这是我连接到 Web 服务并获取数据并使用 Jackson 转换为字符串的代码
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);
.
如何禁用 Jersey 的 Genson 或如何使用 Genson 解决此问题?
谢谢
Genson 的最新文档位于 github http://owlike.github.io/genson/。
实际发生了什么
我不清楚您想在哪里使用 Genson 以及如何使用。您是否仅将 Genson 用于序列化?你是通过球衣使用还是直接使用?
当您执行 getEntity(String.class) 时,Jersey 要求 Genson 将传入的 json 转换为字符串。请注意,通常 json 格式不允许字符串作为根值。
解决方案
升级到 jersey 2.X(以及最新的 Genson 版本),在新的 Jersey 版本中,当您将输入作为字符串询问时,它不会委托给 MessageBodyReader(IMO 的正确行为)。然后你就可以使用这个字符串去选择你想要的任何类型。
使用 ClientResponse 的 getEntityInputStream 方法获取原始 InputStream 并将其转换为字符串。
另一种解决方案是覆盖 MessageBodyReader 的 Gensons 实现,不处理字符串的 deser。
同时处理 JSON 转换的多个库对我来说听起来不合适。特别是两者(Jackson 和 Genson)都提供了一些相似的功能。我打开了 an issue 允许人们在 JAX-RS 应用程序中禁用 Genson。
更新 Genson 1.3 及更高版本为 disable Genson in a Jax-RS 应用程序提供系统。
这是解决方案 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;
}
}