Я застрял в проблеме с конвертерами и привязками. У меня есть страница с формой: выберите, где я связываю список объектов с itemValue
<form:select id="id_a" items="${items}" path="builder" itemValue="id" />
Я создал 2 конвертера, которые конвертируют этот bean. Одно преобразование из bean-компонента в строку, отображающую описание, а другое преобразование из идентификатора для получения bean-компонента из БД.
private Converter<BuilderType, String> getBuilderTypeToStringConverter(){
return new Converter<BuilderType, String>(){
public String convert(BuilderType builder){
return builder.getDescription();
}
};
}
private Converter<String,BuilderType> getStringToBuilderTypeConverter(){
return new Converter<String, BuilderType>(){
public BuilderType convert(String id){
return builderService.findById(new Long(id));
}
};
}
Итак, когда я создаю bean-компонент, все работает нормально, я вижу описание в поле выбора, и при отправке формы идентификатор преобразуется в настоящий bean-компонент и помещается в атрибут модели до достижения контроллера.
проблема в том, что когда я пытаюсь обновить, мой выбор по-прежнему заполняется правильно, но фактическое значение не выбрано. Нет опции с атрибутом "selected" для правильной инициализации выбора.
Это действительно странно, потому что у меня есть образец приложения (petclinic) Spring Roo, который на самом деле с одним и тем же типом конвертеров правильно заполняет select.
Единственный способ, который я нашел, чтобы заставить это работать, - это добавить «.id» к пути:
<form:select id="id_a" items="${items}" path="builder.id" itemValue="id" />
Но таким образом при отправке я получаю обратно в контроллере пустой «строитель» только с установленным идентификатором, а не с полным объектом, который я обычно получаю, когда вызывается правильный преобразователь.
Я действительно понятия не имею, в чем может быть разница между двумя приложениями, которые заставляют одно работать, а другое нет... даже версия библиотеки Spring одинакова!