Tôi có thể đặt null làm giá trị mặc định cho @Value trong Spring không?


98

Tôi hiện đang sử dụng chú thích @Value Spring 3.1.x như sau:

@Value("${stuff.value:}")
private String value;

Điều này đặt một Chuỗi trống vào biến nếu thuộc tính không có mặt. Tôi muốn có null làm mặc định thay vì một Chuỗi trống. Tất nhiên tôi cũng muốn tránh lỗi khi giá trị thuộc tính không được đặt.

Câu trả lời:


66

Bạn phải đặt nullValue của PropertyPlaceholderConfigurer . Ví dụ tôi đang sử dụng chuỗi @nullnhưng bạn cũng có thể sử dụng chuỗi rỗng làm nullValue.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- config the location(s) of the properties file(s) here -->
    <property name="nullValue" value="@null" />
</bean>

Bây giờ bạn có thể sử dụng chuỗi @nullđể đại diện cho nullgiá trị

@Value("${stuff.value:@null}")
private String value;

Xin lưu ý: Không gian tên ngữ cảnh hiện không hỗ trợ giá trị null. Bạn không thể sử dụng

<context:property-placeholder null-value="@null" ... />

Đã thử nghiệm với Spring 3.1.1


2
Cấu hình Java tương đương với điều này là gì?
Kumar Sambhav

30
stackoverflow.com/questions/9347929/… đề cập đến việc sử dụng $ {some.param: # {null}} và điều đó đã hiệu quả với tôi mà không cần phải đặt nullValue, có vẻ như đây là mặc định? (Trong ứng dụng Spring Boot.)
vorburger

5
Khả năng sử dụng đơn giản của SPEL $ {thing.value: # {null}} theo đề xuất của vorburger và trong stackoverflow.com/questions/16735141/…
csf

Có vẻ như cần ít cấu hình hơn cho câu trả lời ben3000 và JRichardsz.
Jeff

192

Điều này thực sự cũ, nhưng bạn có thể sử dụng Spring EL ngay bây giờ, ví dụ:

@Value("${stuff.value:#{null}}")

Xem câu hỏi này .


48

Cảm ơn @vorburger:

@Value("${email.protocol:#{null}}")
String protocol;

sẽ đặt giá trị chuỗi là null mà không có bất kỳ cấu hình nào khác.


3
đã hoạt động trong phiên bản Spring-boot 2019 cuối cùng: 2.1.7.RELEASE ... start.spring.io
JRichardsz

2

Tôi cấp tín dụng cho @nosebrain vì tôi không biết về "null-value" nhưng tôi muốn tránh sử dụng hoàn toàn các giá trị null, đặc biệt vì nó khó biểu diễn nulltrong tệp thuộc tính.

Nhưng đây là một giải pháp thay thế bằng cách sử dụng null với out null-valuevì vậy nó sẽ hoạt động với những gì đã từng thuộc tính giữ chỗ.

public class MyObject {

   private String value;

   @Value("${stuff.value:@null}")
   public void setValue(String value) {
      if ("@null".equals(value)) this.value = null;
      else this.value = value;
   }
}

Cá nhân tôi thích cách của tôi hơn vì có thể sau này bạn muốn stuff.valuelà một giá trị được phân tách bằng dấu phẩy hoặc có lẽ để Enum chuyển đổi dễ dàng hơn. Nó cũng dễ dàng hơn để kiểm tra đơn vị :)

CHỈNH SỬA: dựa trên nhận xét của bạn về việc sử dụng enums và ý kiến ​​của tôi về việc không sử dụng null.

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Ở trên hoạt động tốt cho tôi. Bạn tránh null. Nếu các tệp thuộc tính của bạn muốn tập hợp rõ ràng mà họ không muốn xử lý nó thì bạn thực hiện ( nhưng bạn thậm chí không phải chỉ định điều này vì nó sẽ mặc định là NOTSET ).

crap=NOTSET

nulllà rất xấu và là khác nhau hơn NOTSET. Nó có nghĩa là kiểm tra mùa xuân hoặc đơn vị không thiết lập nó, đó là lý do tại sao có sự khác biệt IMHO. Tôi vẫn có thể sử dụng ký hiệu setter (ví dụ trước) vì nó dễ kiểm tra đơn vị hơn (các biến riêng rất khó đặt trong kiểm thử đơn vị).


Giá trị Chuỗi là một ví dụ, tôi thực sự cần giá trị này cho một giá trị Enum, trong đó một Chuỗi trống chỉ gây ra lỗi chuyển đổi. Với @null, bạn có thể có null là "không có bộ Enum", đó là những gì tôi cần.
Kevin Schmidt

Tất cả lý do nữa tại sao tôi không đề xuất null mà thay vào đó là một số enum đại diện cho not set.
Adam Gent

2
Điều đó sẽ yêu cầu đặt Enum.NOTSET vào tất cả các file tài sản (> 30), mà dường như rất nhiều công việc với hầu như không có lợi ích ...
Kevin Schmidt

Tôi đã không thử điều này nhưng về lý thuyết sẽ không @Value("${stuff.value:NOTSET}")hoạt động?
Adam Gent

Vâng, đây là một giải pháp tốt. Rất tiếc, tôi không thể thay đổi enum (dep), vì vậy tôi phải đi với null. Nếu không, bạn đúng, NOTSET sẽ hoạt động.
Kevin Schmidt

0

Trong trường hợp bạn cần nhập chuỗi rỗng (0 độ dài) "" làm mặc định @Value - hãy sử dụng SPEL (ngôn ngữ biểu thức mùa xuân) như sau:

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

# {''} chỉ tạo cho bạn một chuỗi trống làm mặc định được chèn vào @ Value.

bởi yl

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.