在豆春季JavaConfig性能是没有得到设置?(Spring JavaConfig propert

2019-08-17 16:52发布

我期待在使用Spring JavaConfig与豆某些属性的文件,但性质是没有得到设置?在豆是没有得到设置?

这里是我的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价值?

Answer 1:

我不是100%,但我认为你的@PropertySource是不完全正确。 代替

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

它应该只是:

@PropertySource("classpath:application.properties")

在此基础上:

春天PropertySource文档

此外,基于上述既然你提到你转换到Java的配置方式,而不是XML的链接,我想下​​面的可能解决您的问题:

解决$ {...}在占位符和@Value注释为了解决$ {...}占位符使用来自PropertySource性质定义或@Value注解,必须注册一个PropertySourcesPlaceholderConfigurer。 这会自动发生在XML使用的时候,但必须使用@Configuration类时使用静态@Bean方法明确地注册。 请参阅“与外部化价值的工作”,“在实现BeanFactoryPostProcessor返流@Bean方法记”的细节和例子@Bean的Javadoc @Configuration的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"));

等了余下的属性值。 我只是不熟悉你正在做的方式。 我知道上面的方法将工作,虽然。



Answer 2:

除了@ ssn771答案涉及注入Environment ,并通过它检索的特性,这确实是这样做的建议的方式, 这是我作为一个解决办法做 ,而不必更改的方式@Value在正在使用@Configuration POJO。



Answer 3:

出了许多建议的东西最重要的是,你需要配置PropertySourcesPlaceholderConfigurer在Spring 3.1+(或PropertyPlaceholderConfigurer在Spring 3.0)。 它必须是static ,如果你希望它被应用到配置类(使用@Value注释)。

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

从的javadoc PropertySourcesPlaceholderConfigurer:

该类被设计为在Spring 3.1应用程序PropertyPlaceholderConfigurer一般更换。 它用于通过默认支持属性占位符元件克服弹簧上下文-3.1 XSD工作,而弹簧上下文版本<= 3.0默认PropertyPlaceholderConfigurer保证向后兼容性。 见完整的详细信息弹簧背景XSD文件。



文章来源: Spring JavaConfig properties in bean is not getting set?