В веб-приложении на основе Spring 3 (портлет) у меня есть контроллер с методом, подобным следующему:
@RenderMapping
public ModelAndView handleRenderRequest(...,@RequestParam MyClass myObject)
{
...
}
Теперь мне интересно: как мне сказать Spring, как преобразовать параметр запроса в MyClass.Я нашел информацию о редакторах свойств и об интерфейсе Converter, и, похоже, есть некоторые следствия того, что Converter является преемником редактора свойств, но никому, похоже, не нравится быть откровенным об этом.
Я реализовал интерфейс конвертера дляПреобразование строки в MyClass.Но как мне рассказать об этом Spring?Я использую конфигурацию на основе аннотаций везде, где это возможно, поэтому я проверил, будет ли Spring автоматически обнаруживать конвертер из моего пути к классам, но это не так.
Так думал, что деталь Настройка ConversionService изРуководство хочет сказать мне, что я должен добавить следующее в мой applicationContext.xml, что я и сделал:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="some.package.MyConverter"/>
</list>
</property>
</bean>
Бит еще:
org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение [...]
Так чего мне не хватает?И есть ли способ, просто настроить пакет и позволить Spring сканировать этот пакет на наличие конвертеров и автоматически регистрировать их?И сказать, что в одном определенном методе я хочу использовать другой конвертер, чем во всех других методах.Например, я хочу, чтобы целое число с проверочной суммой Luhn-Checksum и контрольная сумма были удалены, как я могу это сделать?Было бы замечательно что-то вроде @RequestParam (converter = some.package.MyConverter.class).
EDIT
Хорошо, я только что поймал документацию:
Используйте SPI Formatter, когда вы работаете в клиентской среде, такой как веб-приложение, и вам необходимо проанализировать и распечатать локализованные значения полей
Так что я предполагаю, что это означает, что я должен использовать SPI Formatter,еще одна третья возможность рядом с редакторами свойств и конвертерами (я думаю, что я мог бы действительно с таблицей сравнения или тому подобным).Я также реализовал интерфейс Parser и попытался зарегистрировать свой конвертер, используя:
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="some.package.SortOrderEnumConverterSpring"/>
</set>
</property>
</bean>
Как вы можете видеть, я использовал «set» вместо «list» для определения конвертеров.Я установил точку останова отладки в методе FormattingConversionServiceFactoryBean.setConverters, который не срабатывал при использовании списка, но он срабатывал при использовании set.
Дополнительно я добавил
<mvc:annotation-driven conversion-service="conversionService"/>
И пространство имен дляmvc-префикс для моего приложения контекста.Но все же я получаю исключение, не поддерживающее преобразование.
Я также попытался вернуться к подходу преобразователя и изменил в своем файле applicationContext.xml список параметров для преобразователей из списка в набор, но это тоже ничего не изменило.
EDIT2
Как указал digitaljoel, можно установить разные преобразователи на контроллер, используя метод initBinder.Я применил это к своему контроллеру:
@Autowired
private ConversionService conversionService;
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.setConversionService(conversionService);
}
И в моем applicationContext.xml:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="some.package.with.MyConverter"/>
</set>
</property>
</bean>
И все вдруг конвертация работает просто отлично :-).Но я не совсем доволен тем, что мне приходится применять это к каждому контроллеру.Должен быть способ просто установить его в моем applicationContext для всех, не так ли?Хорошо знать, что я могу переопределить значение по умолчанию, если мне нужно (после всего, что я просил об этом), но я все еще хочу установить значения по умолчанию.
А что насчет вещей Formatter.Разве я не должен использовать это вместо Converter?