Проблема сериализации объекта с калиткой

Я пытаюсь передать searchService в форму в Wicket для использования. Когда я запускаю его без финального searchService, у меня не возникает проблем, но я должен сделать его окончательным, чтобы использовать его внутри перезаписанного onSubmit.

    final SearchService searchService = new SearchService();

    Form<?> form = new Form("searchForm") {
        public void onSubmit() {
            List<File> results = searchService.getSearchResults();
            info("Found: " + results.size());
        }
    };

Если я это сделаю, я получу ошибку:

org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException: The object type is not Serializable!
A problem occurred while checking object with type: test.service.SearchService
Field hierarchy is:
  2 [class=test.webui.HomePage, path=2]
    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
      private java.lang.Object org.apache.wicket.MarkupContainer.children[1] [class=org.apache.wicket.markup.html.form.Form, path=2:searchForm]
        private final test.service.SearchService test.webui.HomePage$1.val$searchService [class=test.service.SearchService] <----- field that is causing the problem

Я новичок в калитке, поэтому мне интересно, есть ли правильный способ сделать это?

1 ответ

Да. Это ожидаемое поведение.

Калитка будет сериализовать всю страницу. На самом деле весь поток страниц.

Ошибка, которую вы видите, велика, потому что она помогает вам заставить ваше приложение работать в реплицированном кластере сеансов.

Для ее решения у вас есть несколько вариантов. С верхней части моей головы:

  • Вы можете создать экземпляр SearchService внутри формы onSubmit вместо передачи его в качестве атрибута.
  • Вы можете использовать какую-то инъекцию зависимостей. Калитка поддерживает Guice и Spring из коробки. Но ничто не мешает вам использовать прокси инжектора с другими инжекторами зависимости.
  • Вы можете сохранить SearchService в приложении Wicket вместо страницы. Приложение wicket является несериализуемым синглтоном для каждого узла кластера и доступно в потоке.

Вы можете попробовать реализовать Serializable на ваш SearchService class и объявить переменную serialVersionUID.

Например:

public class SearchService implements Serializable {
    private static final long serialVersionUID = -1769512858853931584L;
    //your code
}
Другие вопросы по тегам