繁体   English   中英

bean中的Spring JavaConfig属性没有设置?

[英]Spring JavaConfig properties in bean is not getting set?

我正在考虑使用Spring JavaConfig和一些属性文件,但bean中的属性没有设置?在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中的值?

我不是100%,但我认为你的@PropertySource不太@PropertySource 代替

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

它应该只是:

@PropertySource("classpath:application.properties")

基于此:

Spring PropertySource文档

另外,根据上面的链接,因为你提到你转换为java配置方法而不是xml,我认为以下可能是你的问题的解决方案:

解析$ {...}占位符和@Value注释为了使用PropertySource中的属性解析定义中的$ {...}占位符或@Value注释,必须注册PropertySourcesPlaceholderConfigurer。 在XML中使用时会自动发生这种情况,但在使用@Configuration类时必须使用静态@Bean方法显式注册。 有关详细信息和示例,请参阅@Configuration Javadoc的“使用外部化值”部分和@Bean Javadoc的“关于BeanFactoryPostProcessor返回@Bean方法的说明”部分。

上面链接中的示例是我通常如何做到的:

 @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"));

等等剩余的属性值。 我对你的做法并不熟悉。 我知道上面的方法会起作用。

除了@ ssn771回答涉及注入Environment并通过它检索属性这确实是建议的方式, 这就是我作为一种解决方法所做的,而不必改变@Value@Configuration中使用的方式@Configuration POJO。

在许多建议的事情中,最重要的是你需要在Spring 3.1+(或Spring 3.0中的PropertyPlaceholderConfigurer中配置PropertySourcesPlaceholderConfigurer 如果要将它应用于配置类(使用@Value注释),它必须是static

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

来自PropertySourcesPlaceholderConfigurer的javadoc:

此类被设计为Spring 3.1应用程序中PropertyPlaceholderConfigurer的一般替代品。 默认情况下,它使用property-placeholder元素来支持spring-context-3.1 XSD,而spring-context version <= 3.0默认使用PropertyPlaceholderConfigurer来确保向后兼容性。 有关完整的详细信息,请参阅spring-context XSD文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM