我有一个包含xsd文件的软件包,用于生成(通过JAXB)与我们的服务器和客户端应用程序相关的共享类。所以这些类包含XML注释。
一个客户端是Android应用程序。我还想在这里使用这些类进行JSON反序列化,因为我与提供JSON的REST服务进行通信(使用Jersey / Jackson)。
我尝试在Android上使用Jackson(版本1.7.2),如下所示:
ObjectMapper mapper = new ObjectMapper();
mapper = mapper.configure(DeserializationConfig.Feature.USE_ANNOTATIONS,
false);
mapper = mapper.configure(SerializationConfig.Feature.USE_ANNOTATIONS,
false);
FooBar someObject = (FooBar) mapper.readValue(jsonString, FooBar.class);
我虽然配置MAPPER应该避免使用注释但我仍然得到
02-07 09:30:18.631: ERROR/AndroidRuntime(447): java.lang.NoClassDefFoundError: javax.xml.bind.annotation.XmlAccessorType
02-07 09:30:18.631: ERROR/AndroidRuntime(447): at java.lang.Class.getDeclaredAnnotations(Native Method)
02-07 09:30:18.631: ERROR/AndroidRuntime(447): at org.codehaus.jackson.map.introspect.AnnotatedClass.resolveClassAnnotations(AnnotatedClass.java:292)
02-07 09:30:18.631: ERROR/AndroidRuntime(447): at org.codehaus.jackson.map.introspect.AnnotatedClass.construct(AnnotatedClass.java:139)
谁知道阻止杰克逊解决注释的伎俩。
由于 克劳斯
答案 0 :(得分:2)
我目前的调查导致了这些结果:
使用DeserializationConfig.Feature.USE_ANNOTATIONS
属性(设置为false)将导致JACKSON DeserializerConfig
类使用NopAnnotationIntrospector
。然后使用此NopAnnotationIntrospector
解析类的注释。对于类的任何注释,NopAnnotationIntrospector
将在每个false
请求上返回isHandled
- 事实上,在进一步处理中不会使用此注释。
所以 - 系统仍然“检查”注释 - 在这种情况下必须在Classpath上。由于Android不提供任何jaxb-api注释,因此会导致NoClassDefFoundError
。
我预计USE_ANNOTATIONS = false
会让JACKSON完全忽略任何注释 - 但不幸的是它没有。我现在将使用Jackson Streaming API来解析JSON字符串,而不是使用JACKSON数据绑定功能。
答案 1 :(得分:0)
对于它的价值,Jackson trunk(1.8.0之前版本)的代码更改将尝试完全禁用注释处理;从理论上讲,这应该可以解决问题。 一个不幸的是,这个问题不会发生在常规J2SE JVM上,而只会发生在Android上;所以修复需要在Android上验证。因此,让Android开发人员验证修复是否完全解决问题(如果没有,需要做更多工作)会很好。