2012-06-30 20 views
6

Ho una tale xml:Come configurare Spring ConversionService con java config?

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
     <property name="converters"> 
      <list> 
       <bean class="converters.AddressToStringConverter" /> 
       <bean class="converters.StringToAddressConverter" /> 
      </list> 
     </property> 
    </bean> 

Esso configura convertitori senza problemi.

Ma poi questo codice non riesce a fare lo stesso:

@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; 
    } 
} 

Questo pezzo di configurazione viene analizzata dal contesto - Ho controllato con debugger. Dove potrebbe essere il problema?

+2

NB: non è necessario fare il 'afterPropertiesSet()' e 'tornare bean.getObject()' - basta tornare il fagiolo fabbrica , Spring invocherà 'afterPropertiesSet()' e 'getObject()' per te. –

risposta

10

Dal mio punto di vista il problema è il nome Bean. Una volta che non si imposta esplicitamente il nome utilizzando @Bean(name="conversionService"), il nome che verrà utilizzato è getConversionService.

Da documentation:

Il nome di questo fagiolo, o se plurale, alias per questo fagiolo. Se lasciato non specificato il nome del bean è il nome del metodo annotato. Se specificato, il nome del metodo viene ignorato.

+0

Grazie, mi ha aiutato :) –

0

Quando si attiva la registrazione, si vedranno i bean che vengono creati da Spring, come descritto here.

configurazione Log

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

uscita Log

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

copio + incollato il codice e ha funzionato senza cambiare il nome. Ho iniettato il ConversionService come segue:

@Resource 
private ConversionService conversionService; 

Questo funziona a causa di Autowiring by type. Quindi potresti avere due fagioli ConversionService.

8

In SpringMVC è possibile estendere WebMvcConfigurerAdapter e utilizzarlo per la configurazione basata su Java. Per registrarti convertitori personalizzati è possibile modificare le "addFormatters" -Metodo come questo

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

} 
Problemi correlati