0

我有一个包,它只包含 xsd 文件来生成(通过 JAXB)与我们的服务器和客户端应用程序相关的共享类。所以这些类包含 XML 注释。

一个客户端是 Android 应用程序。我还想在此处使用这些类进行 JSON 反序列化,因为我与提供 JSON(使用 Jersey/ Jackson)的 REST 服务进行通信。

我尝试在 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)

谁知道阻止杰克逊解析注释的诀窍。

谢谢克劳斯

4

2 回答 2

2

我目前的调查得出以下结果:

DeserializationConfig.Feature.USE_ANNOTATIONS属性的使用(设置为 false)将导致 JACKSONDeserializerConfig类使用NopAnnotationIntrospector. 然后将使用 this 解析类的注释NopAnnotationIntrospector。将在对类上的任何注释的每个请求上NopAnnotationIntrospector返回- 实际上不会在进一步处理中使用此注释。falseisHandled

所以 - 系统仍然“检查”注释 - 在这种情况下必须在 Classpath 上。由于 Android 不提供任何 jaxb-api 注释,这会导致NoClassDefFoundError.

我预计USE_ANNOTATIONS = false会让 JACKSON 完全忽略任何注释 - 但不幸的是它没有。我现在将使用 Jackson Streaming API 来解析 JSON 字符串,而不是使用 JACKSON 数据绑定功能。

于 2011-02-07T15:12:23.847 回答
0

值得一提的是,Jackson trunk (pre-1.8.0) 的代码更改将尝试完全禁用注释处理;从理论上讲,这应该可以解决问题。不幸的是,这个问题不会出现在常规的 J2SE JVM 上,而只会出现在 Android 上;所以修复需要在Android上验证。因此,最好让 Android 开发人员验证修复是否完全解决了问题(如果没有,则需要更多工作)。

于 2011-02-17T00:21:53.923 回答