我一直在寻找这个问题的答案/解决方法。
问题是当将Json字符串转换为Java对象时,会抛出异常“在私有java.lang.Throwable java.lang.Throwable.cause上不允许反射”。
据我所知,GAE是一个沙盒环境,所以我无法按照自己的意愿推动界限,但我很想不必去编写自己的反序列化器。
我正在使用的数据类型的原因非常复杂,因此编写自己的反序列化器不仅耗费时间,而且会破坏使用Jackson和GSON等框架的难度。
以下是Jackson和GSON的代码示例,两种实现都在本地(不是沙盒)工作,而不是在部署到GAE时。 杰克逊:
public class JsonConverterJackson {
private static final ObjectMapper mapper = new ObjectMapper().setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE);
/** This method deserializes the specified Json into an object of the specified class.
* @throws IOException
* @throws JsonMappingException
* @throws JsonParseException
*
*/
public static <T> T convertFromJson(String toConvert, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException{
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.readValue(toConvert, clazz);
}
/**
* This method serializes the specified object into its equivalent Json representation.
* @throws JsonProcessingException
*/
public static String convertToJson(Object toConvert) throws JsonProcessingException{
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.writeValueAsString(toConvert);
}
GSON:
public class JsonConverter {
private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create();
//private static final Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PRIVATE).setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create();
/** This method deserializes the specified Json into an object of the specified class.
*
*/
public static <T> T convertFromJson(String toConvert, Class<T> clazz){
return gson.fromJson(toConvert, clazz);
}
/**
* This method serializes the specified object into its equivalent Json representation.
*/
public static String convertToJson(Object toConvert){
return gson.toJson(toConvert);
}
杰克逊的例外细节: 以下是杰克逊的例外日志:
com.fasterxml.jackson.databind.JsonMappingException: Can not access private java.lang.Throwable java.lang.Throwable.cause (from class java.lang.Throwable; failed to set access: java.lang.IllegalAccessException: Reflection is not allowed on private java.lang.Throwable java.lang.Throwable.cause
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not access private java.lang.Throwable java.lang.Throwable.cause (from class java.lang.Throwable; failed to set access: java.lang.IllegalAccessException: Reflection is not allowed on private java.lang.Throwable java.lang.Throwable.cause
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:272)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:247)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:146)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:
任何建议都是最热情的。
答案 0 :(得分:2)
从POJO中删除自定义异常字段就可以了。 使用GAE安全管理器将序列化为Throwable似乎是一个限制。 您无法访问除您自己以外的任何对象的私有字段。