Использовать JSON-процессор без использования аннотаций - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть пакет, который включает в себя и файл xsd для генерации (через JAXB) общих классов, которые актуальны для наших серверных и клиентских приложений.Таким образом, эти классы содержат аннотации XML.

Один клиент - это приложение для Android.Я также хочу использовать эти классы здесь для десериализации JSON, потому что я общаюсь со службой REST, которая доставляет JSON (с Джерси / Джексон ).

Я пытаюсь использовать Джексон (версия 1.7.2) на Android, как это:

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)

Кто знает, как остановить?Джексон от разрешения аннотаций.

Спасибо, Клаус

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011

Мои текущие исследования привели к таким результатам:

Использование свойства DeserializationConfig.Feature.USE_ANNOTATIONS (со значением false) приведет к тому, что класс JACKSON DeserializerConfig будет использовать NopAnnotationIntrospector. Аннотации класса будут затем разрешены с использованием этого NopAnnotationIntrospector. NopAnnotationIntrospector будет возвращать false для каждого isHandled запроса на любую аннотацию в классе - и фактически не будет использовать эту аннотацию при дальнейшей обработке.

Итак, система все еще "проверяет" аннотации, которые в этом случае должны быть на пути к классам. Поскольку Android не предоставляет аннотации jaxb-api, это приводит к NoClassDefFoundError.

Я ожидал, что USE_ANNOTATIONS = false заставит ДЖЕКСОНА полностью игнорировать любые аннотации - но, к сожалению, это не так. Теперь я буду использовать потоковый API Джексона для анализа строки JSON вместо использования возможностей привязки данных JACKSON.

0 голосов
/ 17 февраля 2011

Для чего бы то ни было, транк Джексона (до 1.8.0) имеет изменения кода, которые попытаются полностью отключить обработку аннотаций; и теоретически это должно решить проблему. Одна неприятная вещь заключается в том, что эта проблема не возникает на обычной JVSE J2SE, а только на Android; поэтому исправление необходимо проверить на Android. Поэтому было бы хорошо, если бы разработчик Android проверил, полностью ли решает проблему (если нет, требуется больше работы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...