Restlet POSTing JSON to Appengine ошибка

У нас есть небольшое приложение с Restlet на сервере GAE и клиенты GWT и Android. Restlet обслуживает GWT-сериализованные ответы клиентам GWT и JSON клиентам Android.

С GWT-сериализацией все в порядке как локально, так и на рабочих серверах AppEngine.

Все в порядке с клиентами Android (JSON), которые общаются с локальным сервером разработки.

Android запускает сервер AppEngine в производство. ПОЛУЧАЕТ ответы JSON, но POST завершается с ошибкой. В логах ошибок и предупреждений нет. Функция на сервере вызывается, но переданный параметр имеет значение null.

Это оскорбительный код:

@Post("json")
public void createLocationJSON(Location location) {  // location is always null
    // do something with 'location'
}

person Peter Knego    schedule 29.10.2010    source источник


Ответы (2)


Просто чтобы все знали: мне удалось заставить работать GAE+Restlet+JSON+GWT после долгих возни. Процесс был действительно хаотичным (напомнил мне дни программирования для Win32): я просто менял настройки, пока он не заработал.

Проблема, с которой я столкнулся:

  1. Он обслуживал неправильное представление (JSON, XML, GWT) не тем клиентам. Позже выяснилось, что нужно было обратить внимание на порядок методов внутри класса. ВТФ??
  2. Я не мог заставить его работать на подпути, например. /отдых/*.

Я не собираюсь использовать Restlet по следующим причинам (подсказка авторам):

  1. Документация скудная, неточная и иногда противоречивая (по-разному объясняющая вещи в разных частях документации).
  2. Конфигурация не является стандартной JAX-RS. Я знаю, что у них есть возможность настроить его как JAX-RS, но все примеры в документах не основаны на этом.

С тех пор я перешел на Джерси.

person Peter Knego    schedule 29.12.2010
comment
На самом деле нормально, до версии 1.5, которая перестала работать на appengine (решено позже с помощью конфигурации): java.net/jira /browse/ДЖЕРСИ-630 - person Peter Knego; 28.03.2011
comment
Тем временем мы заменили его на Resteasy, у которого, ИМХО, лучше документация. - person Peter Knego; 28.03.2011
comment
Спасибо за исследование! Я только начинаю и хочу использовать один из этих фреймворков... вы бы порекомендовали Resteasy? - person Riley Lark; 28.03.2011
comment
Да я бы. Хороший кусок СВ. - person Peter Knego; 28.03.2011

Вы столкнулись с ограничением GAE, с которым столкнулись несколько пользователей Restlet.

Некоторое время назад GAE прекратила поддержку приема фрагментированных HTTP-сущностей. Мы воспроизвели эту проблему как с POST, так и с PUT, а также с необработанными сервлетами GAE, поэтому это не связано с Restlet. См. проблему GAE: http://code.google.com/p/googleappengine/issues/detail?id=129

Единственный обходной путь, который мы нашли, — не разделять объекты на части, что означает возможность заранее вычислить их размер.

В версии Restlet 2.1 M3, которую мы только что выпустили, мы добавили простое свойство «entityBuffering» в ClientResource, чтобы облегчить это (по умолчанию установлено значение «false»).

Мы находимся в процессе обновления нашего примера «Первое приложение», чтобы проиллюстрировать обходной путь. Нам также пришлось столкнуться с нарушением совместимости GWT 2.2 с его предыдущим основным API GWT 2.1, поэтому Restlet 2.1 будет работать только с GWT.

Подробная информация о дополнении доступна на этой странице: http://wiki.restlet.org/docs_2.1/13-restlet/21-restlet/318-restlet/303-restlet.html

С наилучшими пожеланиями,

Джером

Restlet ~ Основатель и технический руководитель ~ http://www.restlet.org

Noelios Technologies ~ http://www.noelios.com

person Jerome Louvel    schedule 31.03.2011
comment
Привет, Джером. Спасибо за -1. Очень классный. Есть некоторые вещи, которые я хотел бы добавить: - person Peter Knego; 31.03.2011
comment
1. Ваш ответ запоздал на несколько месяцев. Где ты был, когда мне нужна была помощь? Вопрос помечен restlet, и я ожидаю, что вы, ребята, будете следить за SO, поскольку этот сайт вопросов и ответов для разработчиков. - person Peter Knego; 31.03.2011
comment
2. Проблема с GAE относится к 2008 году. У меня были проблемы в октябре 2010 года. У вас есть редакция Restlet, специально предназначенная для GAE. Почему вы не могли четко указать в документах, что существует серьезная проблема? - person Peter Knego; 31.03.2011
comment
3. Поддержка GWT. GWT поддерживает несколько механизмов RPC, одним из которых является простой JSON через HTTP (= REST). Зачем нужно было подключаться к нестандартному протоколу, который Google постоянно меняет? - person Peter Knego; 31.03.2011
comment
Что касается GAE, мы получили отчеты об этой проблеме сравнительно недавно и обновили документацию после воспроизведения. Мы не знаем почему, но пример в нашей документации раньше работал и был протестирован непосредственно на GAE. Я подозреваю, что они позже изменили свою политику HTTP, возможно, чтобы сделать ее согласованной между Python и Java (проблема была поднята на Python IIRC) - person Jerome Louvel; 13.04.2011
comment
Restlet/GWT дополнительно поддерживает сериализацию объектов GWT (также используемую в GWT-RPC), поскольку это устраняет необходимость синтаксического анализа и форматирования. Это тип представления/тип носителя, а не протокол. Мы не используем протокол GWT-RPC в Restlet/GWT, хотя его можно использовать параллельно. Кроме того, при согласовании контента один и тот же ресурс REST может предоставлять как чистый JSON, чистый XML, так и формат объекта GWT (и, возможно, другие форматы) на основе одних и тех же bean-компонентов представления. Это отличная функция, которую в целом любят пользователи Restlet. - person Jerome Louvel; 13.04.2011
comment
-1 за то, что не ответил точно на первоначальный вопрос. Также было бы неплохо связаться с нами напрямую и предложить нам отследить SO или, по крайней мере, убедиться, что проблема действительно связана с Restlet (в данном случае GAE). Мы стараемся помочь нашим пользователям в нашем собственном списке рассылки/форуме в приоритетном порядке. Теперь мы признаем важность StackOverflow, и этот обмен побуждает нас отслеживать и быть более активными здесь, так как другой ущерб репутации, по-видимому, может произойти быстро;) Пожалуйста, давайте остановим эту часть обсуждения сейчас. Далее отвечу по техническим вопросам. С уважением, Джером - person Jerome Louvel; 13.04.2011