2013-03-18 2 views
5

Я использую Spring JavaConfig с некоторыми файлами свойств, но свойства в bean-компоненте не устанавливаются? В bean-компоненте не устанавливается?Свойства Spring JavaConfig в bean-компоненте не установлены?

Вот мой 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; 
    } 


} 

Значение в tr.url является "rt.setUrl" не значение в application.properties?

+0

'@Override public void addResourceHandlers (ResourceHandlerRegistry registry)' метод имеет неправильную реализацию. Правильная реализация - 'registry.addResourceHandler ("/resources/** "). AddResourceLocations ("/resources/");' –

ответ

4

Я не 100%, но думаю, что ваш @PropertySource не совсем прав. Вместо

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

Это должно быть просто:

@PropertySource("classpath:application.properties")

на этой основе:

Spring PropertySource Documentation

Кроме того, на основе указанной выше ссылке, и поскольку вы упомянули вы конвертировали в java-конфигурационный подход вместо xml, я думаю, что ниже m IGHT быть решение вашей проблемы:

Разрешающая $ {...} заполнители в и @value аннотаций В для того, чтобы разрешить $ {...} заполнителей в определениях или @value аннотаций с использованием свойства от PropertySource, необходимо зарегистрировать a PropertySourcesPlaceholderConfigurer. Это происходит автоматически при использовании в XML, но должно быть явно зарегистрировано с использованием статического метода @Bean при использовании классов @Configuration. См. Раздел «Работа с внешними значениями» раздел @Configuration Javadoc и «примечание к BeanFactoryPostProcessor-возвращающие методы @Bean» для @Bean Javadoc для подробностей и примеров.

Пример из приведенной выше ссылке, как я обычно делаю это:

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

Так добавить в верхней части:

@Autowired 
Environment env; 

Затем в использовании метода:

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

и т. Д. Для остальных значений свойств. Я просто не так хорошо знаком с тем, как вы это делаете. Я знаю, что вышеупомянутый подход будет работать.

+0

Я изменил его, и это НЕ помогло :( – SJS

+1

Я думаю, что последнее, что я только что опубликовал, может быть вашим потому что вы просто конвертировались в конфигурацию java вместо xml-конфигурации. Добавили ли вы, что 'PropertySourcesPlaceholderConfigurer' в вашу конфигурацию? – ssn771

+0

Я не знаю, что вы имеете в виду, но это .. – SJS

0

Помимо @ ssn771 ответ, который включает в себя инъекции Environment и извлечения свойств через него, который действительно предложил способ сделать это, this is what I've done as a workaround без необходимости изменить способ @Value который используется в @Configuration POJO.

0

Из множества предложенных вещей наиболее важным является то, что вам нужно настроить PropertySourcesPlaceholderConfigurer весной 3.1+ (или PropertyPlaceholderConfigurer весной 3.0). Он должен быть static, если вы хотите, чтобы его применяли к классу конфигурации (для использования аннотаций @Value).

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

От Javadoc для PropertySourcesPlaceholderConfigurer:

Этот класс предназначен в качестве общего для замены PropertyPlaceholderConfigurer в приложениях Spring 3.1. Он по умолчанию используется для поддержки элемента-заполнителя свойства при работе с XSD Spring-context-3.1, тогда как версии весеннего контекста < = 3.0 по умолчанию для PropertyPlaceholderConfigurer для обеспечения обратной совместимости. Подробную информацию см. В документации XSD для весеннего контекста.

Смежные вопросы