2012-06-03 1 views
0

Я отправляю объект с некоторыми примитивными полями, используя Restlet with Jackson converter. До сих пор он отлично работал. Но тогда мне понадобился мой объект для реализации Serializable, потому что мне нужно сохранить его в memcache GAE. По какой-то причине - когда класс реализует Serializable, все перестает работать.Restlet/Jackson работает по-разному, когда объект реализует Serializable

Restlet отправляет другое строковое представление ранее, и я даже не могу напечатать эту строку на сервере. Я попробовал напечатать его байтовое значение, char-by-char и первые цифры:

0xfffd 0xfffd 0x0000 0x0005 0x0073 0x0072 

Большое спасибо!

ответ

2

Что происходит, так это то, что вы получаете результат применения DefaultConverter к возвращенному значению, а не к JacksonConverter. DefaultConverter преобразует объекты Serializable в ObjectRepresentation, который является двоичным представлением (сериализованной формой объекта). В случае отсутствия определенного типа медиаданных логика конвертера видит, что Serializable является в равной степени конвертируемым в ObjectRepresentation или JacksonRepresentation, и из-за того, как упорядочиваются преобразователи, он выбирает первый.

Существует несколько способов борьбы с этим. Проще всего указать нужный тип носителя явно (MediaType.APPLICATION_JSON) в запросе.

Более надежное решение - заменить JacksonConverter на собственную версию, которая имеет нулевой вариант выше текущего значения 0,5. Вы все равно захотите сделать это, если хотите переопределить текущее поведение JacksonRepresentation создания нового ObjectMapper для каждого преобразования или если вы хотите использовать Jackson 2.0. Найдите список реселлеров-обсуждений для моих сообщений о том, как это сделать. (tpeierls)

Вполне возможно, что это поведение было исправлено в более поздних выпусках, и я знаю, что над этими проблемами идет работа, поэтому выполните поиск трекера задач для JacksonConverter, прежде чем перейти к любому курсу действий ,

+0

Спасибо за подробное объяснение. Я попробую ваши предложения и посмотрю, что получится лучше всего. – ravyoli

1

Это может быть не совсем то, что вы искали, но это было достаточно похоже на то, что я думал, что это может быть полезно.

Я использовал Restlet/Android для доступа к API, который я создавал в Restlet/GAE. В какой-то момент мне пришлось изменить классы pojo, которые представляли основные объекты в системе для реализации Serializable. Когда я это сделал, мои попытки получить эти объекты с сервера начали сбой с 415 ошибками. Чтобы исправить путаницу Restlet, на которую должно отправляться представление, я добавил:

Engine.getInstance(). GetRegisteredConverters(). Add (0, новый JacksonConverter());

перед тем, как делать почту(). Дополнительную информацию можно найти по адресу: http://restlet-discuss.1400322.n2.nabble.com/Restlet-Android-Object-representation-selection-application-x-java-serialized-object-vs-application--td6876345.html

Я понимаю, что я не использовал примитивы - ключевое соединение заключается в том, что все порвалось, как только я добавил Serializable.

+0

Спасибо! Я попробую это. ссылка очень полезна. Кажется, что идея добавить Джексона в начале поддерживает ответ Тима. – ravyoli