在我的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解决此问题?
谢谢
实际发生的事情
对我来说,尚不清楚您想在哪里使用Genson以及如何使用。您是否仅使用Genson进行序列化?您是通过球衣还是直接使用它?[当您执行getEntity(String.class)时,Jersey要求Genson将传入的json解串为字符串。请注意,一般json格式不允许将字符串作为根值。
解决方案
更新
Genson 1.3及更高版本为disable Genson in a Jax-RS应用提供了一个系统。使用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;
}
}