2013-03-18 18 views
5

Sto cercando di utilizzare JavaConfig Spring con alcuni file di proprietà, ma le proprietà in bean non vengono impostate? In bean non viene impostato?Le proprietà JavaConfig di Spring in bean non vengono impostate?

Ecco il mio WebConfig:

@Configuration 
@EnableWebMvc 
@PropertySource(value = "classpath:application.properties") 
@Import(DatabaseConfig.class) 
@ImportResource("/WEB-INF/applicationContext.xml") 
public class WebMVCConfig extends WebMvcConfigurerAdapter { 

    private static final String MESSAGE_SOURCE = "/WEB-INF/classes/messages"; 

    private static final Logger logger = LoggerFactory.getLogger(WebMVCConfig.class); 

    @Value("${rt.setPassword}") 
    private String RTPassword; 

    @Value("${rt.setUrl}") 
    private String RTURL; 

    @Value("${rt.setUser}") 
    private String RTUser; 


    @Bean 
    public ViewResolver resolver() { 
     UrlBasedViewResolver url = new UrlBasedViewResolver(); 
     url.setPrefix("/WEB-INF/view/"); 
     url.setViewClass(JstlView.class); 
     url.setSuffix(".jsp"); 
     return url; 
    } 


    @Bean(name = "messageSource") 
    public MessageSource configureMessageSource() { 
     logger.debug("setting up message source"); 
     ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
     messageSource.setBasename(MESSAGE_SOURCE); 
     messageSource.setCacheSeconds(5); 
     messageSource.setDefaultEncoding("UTF-8"); 
     return messageSource; 
    } 

    @Bean 
    public LocaleResolver localeResolver() { 
     SessionLocaleResolver lr = new SessionLocaleResolver(); 
     lr.setDefaultLocale(Locale.ENGLISH); 
     return lr; 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     logger.debug("setting up resource handlers"); 
     registry.addResourceHandler("/resources/").addResourceLocations("/resources/**"); 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     logger.debug("configureDefaultServletHandling"); 
     configurer.enable(); 
    } 

    @Override 
    public void addInterceptors(final InterceptorRegistry registry) { 
     registry.addInterceptor(new LocaleChangeInterceptor()); 
    } 

    @Bean 
    public SimpleMappingExceptionResolver simpleMappingExceptionResolver() { 
     SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver(); 

     Properties mappings = new Properties(); 
     mappings.put("org.springframework.web.servlet.PageNotFound", "p404"); 
     mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure"); 
     mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure"); 
     b.setExceptionMappings(mappings); 
     return b; 
    } 

    @Bean 
    public RequestTrackerConfig requestTrackerConfig() 
    { 
     RequestTrackerConfig tr = new RequestTrackerConfig(); 
     tr.setPassword(RTPassword); 
     tr.setUrl(RTURL); 
     tr.setUser(RTUser); 

     return tr; 
    } 


} 

Il valore in tr.url è "rt.setUrl" non il valore in application.properties?

+0

il metodo '@Override public void addResourceHandlers (ResourceHandlerRegistry registry)' ha un'implementazione errata. L'implementazione corretta è 'registry.addResourceHandler ("/resources/** "). AddResourceLocations ("/resources/");' –

risposta

4

Non sono al 100%, ma penso che il tuo @PropertySource non sia proprio corretto. Invece di

@PropertySource(value = "classpath:application.properties")

Dovrebbe essere solo:

@PropertySource("classpath:application.properties")

sulla base di questo:

Spring PropertySource Documentation

Inoltre, in base al link qui sopra e visto che hai citato stavi convertendo in un approccio di java config invece di xml, penso che il sotto m ight essere la soluzione al vostro problema:

Risoluzione dei $ {...} segnaposto e annotazioni @value In fine di risolvere $ {...} segnaposto in definizioni o @Value annotazioni utilizzando oggetti di un PropertySource, si deve registrare a PropertySourcesPlaceholderConfigurer. Ciò avviene automaticamente quando si utilizza in XML, ma deve essere registrato esplicitamente utilizzando un metodo statico @Bean quando si utilizzano le classi @Configuration. Vedi la sezione "Lavorare con valori esterni" di @Configuration Javadoc e "una nota su BeanFactoryPostProcessor-return @Bean methods" di @Bean Javadoc per dettagli ed esempi.

L'esempio dal link qui sopra è come faccio di solito è:

@Configuration 
@PropertySource("classpath:/com/myco/app.properties") 
public class AppConfig { 
    @Autowired 
    Environment env; 

    @Bean 
    public TestBean testBean() { 
     TestBean testBean = new TestBean(); 
     testBean.setName(env.getProperty("testbean.name")); 
     return testBean; 
    } 
} 

in modo da aggiungere al top:

@Autowired 
Environment env; 

Poi nel vostro uso metodo:

tr.setPassword(env.getProperty("rt.setPassword")); 

e così via per i restanti valori di proprietà. Io non sono così familiare con il modo in cui lo stai facendo. So che l'approccio sopra funzionerà comunque.

+0

l'ho modificato e NON ha aiutato :( – SJS

+1

Penso che l'ultima cosa che ho appena postato potrebbe essere la tua Poiché hai appena convertito in java config al posto della configurazione xml. Hai aggiunto 'PropertySourcesPlaceholderConfigurer' alla tua configurazione? – ssn771

+0

Non so cosa intendi ma ... – SJS

0

parte @ ssn771 risposta che consiste nell'iniettare il Environment e recuperare le proprietà attraverso di essa che è effettivamente il modo suggerito di farlo, this is what I've done as a workaround senza dover cambiare il modo @Value viene utilizzato nel @Configuration POJO.

0

Tra le molte cose suggerite, la più importante è che è necessario configurare PropertySourcesPlaceholderConfigurer in Spring 3.1+ (o PropertyPlaceholderConfigurer in Spring 3.0). Deve essere static se si desidera che venga applicato alla classe di configurazione (per utilizzare le annotazioni @Value).

@Bean 
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
} 

Da javadoc per PropertySourcesPlaceholderConfigurer:

Questa classe è progettato come una sostituzione generale per PropertyPlaceholderConfigurer in Spring 3.1 applicazioni. Viene utilizzato per impostazione predefinita per supportare l'elemento segnaposto-proprietà nel lavorare contro XSD spring-context-3.1, mentre le versioni del contesto primaverile < = 3.0 sono predefinite in PropertyPlaceholderConfigurer per garantire la compatibilità con le versioni precedenti. Vedi la documentazione XSD del contesto primaverile per i dettagli completi.

Problemi correlati