Cách xác định @Value là tùy chọn


119

Tôi có những thứ sau trong một Spring bean:

@Value("${myValue}")
private String value;

Giá trị được nhập chính xác. Tuy nhiên, biến cần phải là tùy chọn, nó được chuyển vào dưới dạng tham số dòng lệnh (sau đó được thêm vào ngữ cảnh Spring bằng cách sử dụng SimpleCommandLinePropertySource ) và đối số này sẽ không luôn tồn tại.

Tôi đã thử cả hai cách sau để cung cấp giá trị mặc định:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

nhưng trong mỗi trường hợp, đối số mặc định sau dấu hai chấm được đưa vào ngay cả khi có giá trị thực - điều này xuất hiện ghi đè những gì Spring sẽ đưa vào.

Cách chính xác để chỉ định @Value là không bắt buộc?

Cảm ơn


Điều đó rất lạ ... giá trị mặc định chỉ hoạt động như một giá trị mặc định (tức là khi thuộc tính không được xác định). Bạn có thể kiểm tra lại câu lệnh của mình "giá trị mặc định được đưa vào ngay cả khi có giá trị thực" (ví dụ: nếu không có một lớp đã biên dịch cũ) không?
Pavel Horal

7
@Value("${some.prop:}")làm việc cho tôi. Đó là Chú thích duy nhất trên biến đó.
Zarathustra

Bạn có thể đăng cấu hình ứng dụng của mình không?
Vladimir Vagaytsev

@ Không mong muốn (bắt buộc = sai)?
Andrew Scott Evans

Câu trả lời:


179

Cách chính xác để chỉ định @Value là không bắt buộc?

Làm việc trên giả định rằng do 'không bắt buộc' nghĩa là bạn null...

Bạn đã lưu ý chính xác rằng bạn có thể cung cấp giá trị mặc định ở bên phải của một :ký tự. Ví dụ của bạn là @Value("${myValue:DEFAULT}").

Bạn không bị giới hạn ở các chuỗi thuần túy làm giá trị mặc định. Bạn có thể sử dụng biểu thức SPEL và biểu thức SPEL đơn giản để trả về nulllà:

@Value("${myValue:#{null}}")

49

Nếu bạn đang sử dụng Java 8, bạn có thể tận dụng java.util.Optionallớp của nó . Bạn chỉ cần khai báo biến theo cách này:

@Value("${myValue:#{null}}")
private Optional<String> value;

Sau đó, bạn có thể kiểm tra xem giá trị có được xác định hay không theo cách đẹp hơn:

if (value.isPresent()) {
    // do something cool
}

Hy vọng nó giúp!


4
Theo ý tưởng intelliJ. Đây không phải là cách tốt nhất để sử dụng Optionalcác kiểu trong các trường lớp.
Fırat KÜÇÜK

2
Bạn làm điều này và nó ném ra một NPE. valuelà null.
aatk

1
@aatk Có vẻ như sự cố bạn mô tả đã được khắc phục ít nhất kể từ 4.3.13. Tôi không gặp khó khăn gì khi sử dụng khai báo được mô tả. Mặc dù tốt hơn là chỉ sử dụng giá trị nullable: blog.joda.org/2015/08/…
Torben

2
"Theo ý tưởng của intelliJ. Không phải là phương pháp hay nhất để sử dụng Loại tùy chọn trong các trường lớp." có gì sai khi sử dụng Tùy chọn làm biến thể hiện? chỉ có điều đó là tương đối lâu dài so với khi được sử dụng trong getters ... và trường như vậy nên được đánh dấu Tạm thời để tuần tự hóa?
Andrey M. Stepanov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.