Как настроить 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 - бобов.