2015-03-19 24 views
6

Hiện tại tôi có cấu hình Spring xml (Spring 4) tải một tệp thuộc tính.Trình giữ chỗ mùa xuân không giải quyết các thuộc tính trong JavaConfig

context.properties

my.app.service = myService 
my.app.other = ${my.app.service}/sample 

cấu hình Spring xml

<bean id="contextProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="fileEncoding" value="UTF-8" /> 
    <property name="locations"> 
     <list> 
      <value>classpath:context.properties</value> 
     </list> 
    </property> 
</bean> 
<bean id="placeholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="properties" ref="contextProperties" /> 
    <property name="nullValue" value="@null" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
</bean> 

Bean mà sử dụng các thuộc tính

@Component 
public class MyComponent { 

    @Value("${my.app.other}") 
    private String others; 

} 

này hoạt động hoàn hảo và giá trị othersMyService/sample, như loại trừ. Nhưng khi tôi cố gắng thay thế cấu hình này bằng JavaConfig, thì @Value trong thành phần của tôi không hoạt động theo cùng một cách. giá trị không phải là myService/sample nhưng ${my.app.service}/sample.

@Configuration 
@PropertySource(name="contextProperties", ignoreResourceNotFound=true, value={"classpath:context.properties"}) 
public class PropertiesConfiguration { 

    @Bean 
    public static PropertyPlaceholderConfigurer placeholder() throws IOException { 
     PropertyPlaceholderConfigurer placeholder = new PropertyPlaceholderConfigurer(); 
     placeholder.setNullValue("@null"); 
     placeholder.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE); 
     return placeholder; 
    } 

} 

Tôi có bỏ lỡ điều gì đó trong chuyển đổi từ xml sang Javaconfig không?

ps: Tôi cũng cố gắng tạo nhanh PropertySourcesPlaceholderConfigurer thay vì PropertyPlaceholderConfigurer mà không thành công hơn.

+0

Ngay cả khi nó không giải quyết được sự cố của bạn, tôi có thể xác nhận rằng bạn nên sử dụng 'PropertySourcesPlaceholderConfigurer', không phải' PropertyPlaceholderConfigurer' – superbob

+0

Thuộc tính 'my.app.service' có được giải quyết không? Kiểm tra bằng '@Value (" $ {my.app.service} ")', tôi đi lang thang nếu vấn đề xuất phát từ thuộc tính lồng nhau. – superbob

Trả lời

2

Cập nhật để sử dụng cấu hình PropertySourcesPlaceholderConfigurer. Chỉ cần có @PropertySource chú thích sẽ không đủ:

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

@PropertySource chú thích không tự động đăng ký một PropertySourcesPlaceholderConfigurer với mùa xuân. Do đó chúng ta cần phải cấu hình một cách rõ ràng PropertySourcesPlaceholderConfigurer

Dưới JIRA vé có thêm thông tin về lý do đằng sau thiết kế này:

https://jira.spring.io/browse/SPR-8539

UPDATE: Tạo ứng dụng khởi động đơn giản mùa xuân để sử dụng tính lồng nhau. Nó hoạt động tốt với cấu hình trên.

https://github.com/mgooty/property-configurer/tree/master/complete

+0

Cập nhật câu trả lời – Mithun

+0

Tôi nghĩ rằng OP đã làm điều đó, và nó không hoạt động, xem 'ps' của mình trong câu hỏi. Tôi đi lang thang nếu vấn đề có vẻ liên quan đến việc lồng ghép thuộc tính ('my.app.other = $ {my.app.service}/sample') – superbob

1

lựa chọn khác là nhập khẩu PropertyPlaceholderAutoConfiguration.class.

import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; 

@Import(PropertyPlaceholderAutoConfiguration.class) 

Chú thích bao gồm PropertySourcesPlaceholderConfigurer trong ngữ cảnh nếu nó không tồn tại.

+0

Có, điều này làm việc cho bối cảnh ** spring-boot **. –

Các vấn đề liên quan