В приложении с веб-интерфейсом (портлет) Spring 3 у меня есть контроллер с таким способом:
@RenderMapping
public ModelAndView handleRenderRequest(...,@RequestParam MyClass myObject)
{
...
}
Теперь я задаюсь вопросом: как сообщить Spring, как преобразовать параметр запроса в MyClass. Я нашел информацию об редакторах свойств и об интерфейсе конвертера, и, похоже, некоторые из них говорят о том, что конвертер является преемником редактора свойств, но, похоже, ему не нравится быть явным.
Я реализовал интерфейс конвертера для преобразования String в MyClass. Но как мне сказать Spring об этом? Я использую настройку на основе аннотаций, где это возможно, поэтому я проверил, будет ли Spring автоматически обнаруживать конвертер из моего пути к классам, но это не так.
Поэтому подумал, что часть Настройка службы конверсии из руководства хочет сказать мне, что мне нужно добавить следующее к моему 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) было бы здорово.
ИЗМЕНИТЬ
Хорошо, я просто попал в документацию:
Используйте 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-префикса для моего приложенияContext. Но все же я получаю исключение, не поддерживаемое преобразованием.
Я также попытался вернуться к подходу конвертера и изменил в своем файле applicationContext.xml список параметров для преобразователей из списка в набор, но это ничего не изменило.
EDIT2
Как отмечалось в Digitaljoel, можно установить разные преобразователи на контроллер с помощью метода initBinder. Я применил это к моему контроллеру:
@Autowired
private ConversionService conversionService;
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.setConversionService(conversionService);
}
И в моем приложенииContext.xml:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="some.package.with.MyConverter"/>
</set>
</property>
</bean>
И все вдруг конверсия работает просто отлично:-). Но я не очень доволен необходимостью применять это к каждому из моих контроллеров. Должен быть способ просто установить его в моем приложении для всех, не так ли? Хорошо знать, что я могу переопределить значение по умолчанию, если мне нужно (в конце концов, я просил об этом), но я все еще хочу установить значения по умолчанию.
А как насчет материала Formatter. Должен ли я использовать это вместо конвертера?