Исключение NotSerializableException, выходящее из контроллера Spring и вызывающее проблемы с очередью Google App Engine

#java #google-app-engine #spring-mvc #exception-handling

#java #google-app-engine #spring-mvc #исключение

Вопрос:

У меня есть Spring Controller, который вызывается через HTTP POST из планировщика очереди GAE.

 @Controller
@RequestMapping(value = RSSPoller.RSS_POLLER_URL)
public class RSSPoller implements Serializable {
  private static final long serialVersionUID = -4925178778477404709L;

  public static final String RSS_POLLER_URL = "/rsspoller";

  @RequestMapping(method = RequestMethod.POST)
  @ResponseStatus(HttpStatus.OK)
  public void pollAndProcessRssFeed() throws ServiceException  {
    try  {
      // do some stuff
    }
    catch(Exception e)  {
      throw new ServiceException("Can't process RSS feed because", e);
    }
  }
}
  

Однако при его вызове код ответа равен 500 с критическим сообщением журнала

 Uncaught exception from servlet
java.lang.RuntimeException: java.io.NotSerializableException: <some spring class that changes all the time, but does not implement java.io.Serializable>
  

В журналах также отображается то же сообщение журнала с уровнем предупреждения.

Я получаю похожие предупреждающие сообщения (но не критичные) в своих журналах, когда я вызываю другие контроллеры Spring, которые либо отображают веб-страницу (GET), либо возвращают некоторые XML-данные (по сути, RPC вызывает, которые используют HTTP POST). Когда я выполняю HTTP GET / POST для этих URL-адресов, код ответа равен 200, и вывод правильный (и я игнорирую предупреждающее сообщение в журналах).

Это приводит меня к двум вопросам:

  1. Почему я получаю сообщение о критической ошибке / HTTP 500 для POST из очереди, но не GET / POST для других Spring Controllers в моем приложении?
  2. Как я могу перехватить исключение и, по существу, отбросить его; что касается моих целей, задача выполнена.

Я могу опубликовать полный журнал исключений, если это полезно; для краткости я его опустил.

Ответ №1:

вы должны сделать свой <some spring class that changes all the time, but does not implement java.io.Serializable> просто сериализуемым (не только контроллер). Мне, по крайней мере, помогло это.

Комментарии:

1. Я пытался это сделать, но график объектов получился слишком громоздким. Нужно было бы сделать каждый класс в Spring сериализуемым 😉 В конце концов я сдался.