Форма Spring: select не отображается с выбранным атрибутом option

Я застрял в проблеме с конвертерами и привязками. У меня есть страница с формой: выберите, где я связываю список объектов с 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 одинакова!


person Massimo    schedule 28.11.2012    source источник


Ответы (2)


Я нашел проблему. Кажется, в web.xml рабочего приложения был другой фильтр, который я не использовал, просто добавив его, все заработало нормально:

<filter>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Это действительно странно, потому что я нигде не обнаружил, что это было обязательным или хотя бы мало связано с пружинными тегами, чтобы заставить их работать должным образом!

person Massimo    schedule 29.11.2012

Я думаю, вам следует определить метод equals для класса сущностей (BuilderType) и сравнить экземпляры по идентификатору. В противном случае генерация формы не сможет найти текущее значение из списка элементов для опций.

Вы можете убедиться в этом, проверив вызовы equals при реализации в BuilderType.

Я столкнулся с той же проблемой и смог решить ее с помощью этот комментарий и пример кода (AbstractEntity.java) в Книга весенних данных.

person Mikko Suonio    schedule 24.01.2013
comment
как я уже сказал, это было решено путем добавления в конфигурацию вышеуказанного фильтра и без изменения кода, опубликованного с вопросом. До сих пор не знаю, почему нигде не сказано, что это требуется, чтобы все работало. - person Massimo; 25.01.2013