7

我有这样的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;
    }
}

这段配置被上下文扫描——我用调试器检查了它。问题可能出在哪里?

4

3 回答 3

10

从我的角度来看,您的问题是Bean名称。一旦您没有使用@Bean(name="conversionService")将要使用的名称显式设置名称是getConversionService.

文档

此 bean 的名称,如果是复数,则为此 bean 的别名。如果未指定,则 bean 的名称是带注释的方法的名称。如果指定,则忽略方法名称。

于 2012-06-30T10:59:29.420 回答
8

在 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();
    }

}
于 2013-12-12T21:13:39.013 回答
0

当您启用日志记录时,您将看到 Spring 创建了哪些 Bean,如此所述。

日志配置

    <logger name="org.springframework.beans" level="DEBUG" />

日志输出

    DEBUG (AbstractAutowireCapableBeanFactory.java:458) - Finished creating instance of bean 'getConversionService'

我复制+粘贴了您的代码,它在不更改名称的情况下工作。我注入ConversionService如下:

@Resource
private ConversionService conversionService;

这是因为按类型自动装配。所以也许你有两个ConversionService豆子。

于 2012-12-21T15:52:38.467 回答