Как настроить Spring ConversionService с конфигурацией java?
у меня такой xml:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converters.AddressToStringConverter" />
<bean class="converters.StringToAddressConverter" />
</list>
</property>
</bean>
настройки преобразователей без проблем.
но тогда этот код не может сделать то же самое:
@Configuration
public class ConversionConfiguration {
@Bean
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(getConverters());
bean.afterPropertiesSet();
ConversionService object = bean.getObject();
return object;
}
private Set<Converter> getConverters() {
Set<Converter> converters = new HashSet<Converter>();
converters.add(new AddressToStringConverter());
converters.add(new StringToAddressConverter());
return converters;
}
}
этот фрагмент конфигурации сканируется контекстом - я проверил его с помощью отладчика. Где может быть проблема?
3 ответов
С моей точки зрения ваша проблема-это Bean
имя. После того, как вы не явным образом установить имя с помощью @Bean(name="conversionService")
имя, которое будет использовано getConversionService
.
С документация:
имя этого боба, или если множественное число, псевдонимы для этого боба. Если слева энное имя Боба-имя аннотированный метод. Если указано, имя метода игнорируется.
в SpringMVC вы можете расширить WebMvcConfigurerAdapter и использовать его для конфигурации на основе Java. Для регистрации пользовательских преобразователей вы можете изменить "addFormatters" - метод, как это
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "..." })
public class ApplicationConfiguration extends WebMvcConfigurerAdapter
{
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver()
{
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void addFormatters(FormatterRegistry formatterRegistry)
{
formatterRegistry.addConverter(getMyConverter());
}
@Bean
public StringToCounterConverter getMyConverter()
{
return new StringToCounterConverter();
}
}
когда вы включите ведение журнала, вы увидите, какие бобы создаются весной, как описано здесь.
конфигурация журнала
<logger name="org.springframework.beans" level="DEBUG" />
выход журнала
DEBUG (AbstractAutowireCapableBeanFactory.java:458) - Finished creating instance of bean 'getConversionService'
Я скопировал + вставил ваш код, и он работал без изменения имени. Я ввел ConversionService
следующим образом:
@Resource
private ConversionService conversionService;
это работает из-за Autowiring по типу. Так, может быть, у вас было два ConversionService
- бобов.