Проблема сериализации объекта с калиткой
Я пытаюсь передать 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
}