2011-01-15 23 views
19

Tôi cố gắng để sử dụng chú thích @value trong các thông số của một nhà xây dựng như sau:Xuân @value chú thích không sử dụng giá trị mặc định khi tài sản là không có mặt

@Autowired 
public StringEncryptor(
    @Value("${encryptor.password:\"\"}") String password, 
    @Value("${encryptor.algorithm:\"PBEWithMD5AndTripleDES\"}") String algorithm, 
    @Value("${encryptor.poolSize:10}") Integer poolSize, 
    @Value("${encryptor.salt:\"\"}") String salt) { 
... 
} 

Khi các tập tin thuộc tính có mặt trên classpath, các các thuộc tính được nạp một cách hoàn hảo và phép thử thực hiện tốt. Tuy nhiên khi tôi loại bỏ các tập tin thuộc tính từ classpath, tôi đã có thể mong đợi rằng các giá trị mặc định sẽ được sử dụng, ví dụ poolSize sẽ được thiết lập để 10 hoặc thuật toán để PBEWithMD5AndTripleDES tuy nhiên đây không phải là trường hợp.

Chạy mã thông qua một trình gỡ lỗi (mà sẽ chỉ làm việc sau khi thay đổi @Value("${encryptor.poolSize:10}") Integer poolSize để @Value("${encryptor.poolSize:10}") String poolSize như nó đã gây NumberFormatExceptions) Tôi thấy rằng giá trị mặc định không được thiết lập và các thông số theo hình thức:

poolSize = ${encryptor.poolSize:10} hoặc

algorithm = ${encryptor.algorithm:"PBEWithMD5AndTripleDES"} 

chứ không phải là dự kiến ​​

poolSize = 10 hoặc

algorithm = "PBEWithMD5AndTripleDES" 

Dựa trên SPR-4785 ký hiệu như $ {my.property:myDefaultValue} sẽ hoạt động. Nhưng nó không xảy ra với tôi!

Cảm ơn bạn

Trả lời

22

Có thể khởi tạo trình giữ chỗ trình giữ chỗ của thuộc tính không thành công do tệp thuộc tính bị thiếu, do đó trình giữ chỗ không được giải quyết. Bạn có thể cấu hình nó để bỏ qua các file lỡ như sau (nếu bạn sử dụng context namespace để cấu hình nó):

<context:property-placeholder ignore-resource-not-found="true" ... /> 

Ngoài ra bạn không cần "..." xung quanh giá trị mặc định.

+0

Chính xác những gì tôi đã mất tích. Cảm ơn bạn! – garyj

+0

... hoặc nếu sử dụng cấu hình dựa trên chú thích bằng 'PropertySourcePlaceholderConfigurer':' propertySourcesPlaceholderConfigurer.setIgnoreResourceNotFound (true); ' –

6

bỏ qua tài nguyên không tìm thấy = "true" là không cần thiết cho các giá trị mặc định được chọn. Điểm xác định giá trị mặc định là giá trị được sử dụng nếu thuộc tính không được tìm thấy ở bất kỳ đâu.

Tôi nghĩ câu cuối cùng trong câu trả lời trước chỉ ra vấn đề - EL không chính xác mà bạn phải cung cấp ban đầu nhưng sau đó bị xóa khỏi ví dụ. Thực tế là bạn cũng nhận được ngoại lệ chuyển đổi định dạng cho điểm đó. Thông thường, Spring sẽ tự động chuyển đổi chuỗi thành loại Java "chuẩn" thích hợp và nếu bạn cung cấp dịch vụ chuyển đổi mùa xuân của riêng bạn, cho các đối tượng tùy chỉnh của bạn - miễn là dịch vụ chuyển đổi của bạn được xác định trong ngữ cảnh ứng dụng.

"bỏ qua tài nguyên không tìm thấy" hữu ích khi bạn đang tiêm thuộc tính qua XML không mặc định và không muốn vùng chứa ném một ngoại lệ khởi tạo bean trong trường hợp không tìm thấy thuộc tính. Trong những trường hợp như vậy, các thuộc tính bean sẽ được khởi tạo với các giá trị mặc định của Java, ví dụ: nulls fro objects, 0s cho giá trị số nguyên thủy, v.v.

2

Trong trường hợp của tôi, việc giải quyết các giá trị thuộc tính (và mặc định) không hoạt động trong thử nghiệm, nơi tôi sử dụng cấu hình dựa trên chú thích. Nó bật ra rằng tôi đã phải thêm một PropertySourcesPlaceholderConfigurer để các thuộc tính thực sự được giải quyết. Nó được giải thích trong số PropertySource Annotation JavaDoc:

Để giải quyết $ {...} placeholders trong định nghĩa hoặc chú thích @Value bằng cách sử dụng các thuộc tính từ PropertySource, phải ghi lại một PropertySourcesPlaceholderConfigurer. Điều này xảy ra tự động khi sử dụng trong XML, nhưng phải được đăng ký một cách rõ ràng bằng cách sử dụng phương thức @Bean tĩnh khi sử dụng các lớp @Configuration. Xem phần "Làm việc với các giá trị bên ngoài" của @Configuration Javadoc và "một lưu ý về BeanFactoryPostProcessor-return @Bean methods" của @Bean Javadoc để biết chi tiết và ví dụ.

Sau đây đã làm các trick:

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

Và nếu bạn muốn thêm các thuộc tính cá nhân:

@Bean 
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 

    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 

    Properties properties = new Properties(); 
    properties.put("batchSize", "250"); 
    propertySourcesPlaceholderConfigurer.setProperties(properties); 

    return propertySourcesPlaceholderConfigurer; 
} 
Các vấn đề liên quan