2012-02-19 27 views
19

Khi sử dụng Spring, bạn có thể đặt thuộc tính chỉ khi giá trị được chuyển không phải là null không?Mùa xuân - chỉ đặt thuộc tính nếu giá trị không rỗng là

Ví dụ:

<bean name="myBean" class="some.Type"> 
    <property name="abc" value="${some.param}"/> 
</bean> 

Các hành vi Tôi đang tìm kiếm là:

some.Type myBean = new some.Type(); 
if (${some.param} != null) myBean.setAbc(${some.param}); 

Lý do tôi cần điều này là kể từ abc có một giá trị mặc định mà tôi không muốn ghi đè lên với a null. Và Bean tôi đang tạo không thuộc quyền kiểm soát nguồn của tôi - vì vậy tôi không thể thay đổi hành vi của nó. (Ngoài ra, abc cho mục đích này có thể là một nguyên thủy, vì vậy tôi không thể thiết lập nó với một null nào

EDIT:.
Theo câu trả lời Tôi nghĩ rằng câu hỏi của tôi đòi hỏi phải làm rõ

tôi. có đậu Tôi cần phải nhanh chóng và vượt qua cho bên thứ 3. Tôi sử dụng bean này có nhiều thuộc tính (12 hiện) các loại khác nhau (int, boolean, String, v.v.)
Mỗi thuộc tính có giá trị mặc định - Tôi không biết nó là gì và không muốn biết trừ khi nó trở thành một vấn đề. 210 Những gì tôi đang tìm kiếm là một giải pháp chung đến từ khả năng của Spring - hiện tại giải pháp duy nhất tôi có là một sự phản chiếu dựa trên.

Cấu hình

<bean id="myBean" class="some.TypeWrapper"> 
    <property name="properties"> 
    <map> 
     <entry key="abc" value="${some.value}"/> 
     <entry key="xyz" value="${some.other.value}"/> 
     ... 
     </map> 
    </property> 
</bean> 

public class TypeWrapper 
{ 
    private Type innerBean; 

    public TypeWrapper() 
    { 
     this.innerBean = new Type(); 
    } 

    public void setProperties(Map<String,String> properties) 
    { 
     if (properties != null) 
     { 
      for (Entry<String, Object> entry : properties.entrySet()) 
      { 
       String propertyName = entry.getKey(); 
       Object propertyValue = entry.getValue(); 

       setValue(propertyName, propertyValue); 
      } 
     } 
    } 

    private void setValue(String propertyName, Object propertyValue) 
    { 
     if (propertyValue != null) 
     { 
      Method method = getSetter(propertyName); 
      Object value = convertToValue(propertyValue, method.getParameterTypes()[0]); 
      method.invoke(innerBean, value); 
     } 
    } 

    private Method getSetter(String propertyName) 
    { 
     // Assume a valid bean, add a "set" at the beginning and toUpper the 1st character. 
     // Scan the list of methods for a method with the same name, assume it is a "valid setter" (i.e. single argument) 
     ... 
    } 

    private Object convertToValue(String valueAsString, Class type) 
    { 
     // Check the type for all supported types and convert accordingly 
     if (type.equals(Integer.TYPE)) 
     { 
      ... 
     } 
     else if (type.equals(Integer.TYPE)) 
     { 
      ... 
     } 
     ... 
    } 
} 

Các sản "khó khăn" là trong việc thực hiện convertToValue cho tất cả các loại giá trị càng tốt. Tôi đã làm điều này nhiều lần trong đời - vì vậy nó không phải là một vấn đề lớn để thực hiện nó cho tất cả các loại có thể mà tôi cần (chủ yếu là nguyên thủy và một vài enums) - nhưng tôi hy vọng một giải pháp thông minh hơn đã tồn tại.

Trả lời

1

Bạn có thể tạo ra một lớp Utility sẽ đóng vai trò như một lớp Factory cho some.Type, và quấn logic có

Ví dụ:

public class TypeFactory { 
    public static Type craeteType(SomeType param){ 
     Type t = new Type(); 
     if(param!=null) 
      t.setParam(param); 
    } 
} 

và trên XML cấu hình tạo đậu sử dụng phương pháp Nhà máy này

<bean id="myBean" class="some.Type" 
     factory-method="craeteType"> 
    <constructor-arg ref="param"/> 
</bean> 
3

Bạn có thể sử dụng khái niệm giá trị mặc định trong trình cấu hình thuộc tính trong khung làm việc Spring như sau:

<bean name="myBean" class="some.Type"> 
    <property name="abc" value="${some.param : your-default-value}"/> 
</bean> 

bạn có thể đặt giá trị mặc định theo phương pháp này. Bởi bối cảnh này cấu hình nếu some.param khóa tồn tại để giá trị của nó được đặt trong thuộc tính abc và nếu không tồn tại your-default-value đặt trong tài sản abc. Lưu ý: Một lợi ích khác của approah này là: "Trong mô hình lập trình POJO tốt hơn approzh là thành viên của lớp không có bất kỳ giá trị mặc định nào, và giá trị mặc định được đưa ra khỏi lớp."

+0

Thanks for the tip - điều này có thể hữu ích trong tương lai, nhưng trong trường hợp của tôi, tôi không thể sử dụng nó - như tôi đã nói, đậu này không nằm trong kiểm soát nguồn của tôi - vì vậy tôi không biết mặc định của nó là gì (và không muốn biết). Tôi đã hy vọng cho một cái gì đó các dòng: '' – RonK

0

này trông giống như một công việc cho Java-based container configuration. Bạn sẽ có thể để làm những gì bạn làm trong cấu hình XML của bạn, nhưng với tất cả sức mạnh của Java.

5

Đối với giải quyết vấn đề của bạn, bạn phải sử dụng SEL .. (Spring Expression Language) Bằng tính năng này (bổ sung trong mùa xuân 3,0), bạn có thể chẳng hạn như ngôn ngữ năng động khác bằng văn bản tình trạng của bạn đối với hoàn cảnh của bạn, câu trả lời là:

<bean name="myBean" class="some.Type"> 
    <property name="abc" value="#(if(${some.param} != null) ${some.param})"/> 
</bean> 

để biết thêm thông tin xem (hướng dẫn này nói gì sử dụng SEL trong tệp ngữ cảnh): http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html

+6

Nó sẽ không vượt qua một chuỗi rỗng nếu tham số là null? OP không muốn vượt qua bất cứ điều gì: anh ta muốn tránh gọi setter. –

+0

'# {$ {some.param}! = #null? $ {some.param}: #null} 'có vẻ chính xác hơn – Vadzim

0

tôi đã nhận nó làm việc với đoạn như sau:

<bean name="myBean" class="some.Type"> 
    <property name="abc" value="#{'${some.param}'=='' ? null : '${some.param}'}" /> 
</bean> 
+0

Không phải những gì tôi cần - nhưng dù sao cũng được. – RonK

+0

@Ronk - bạn có tìm thấy giải pháp để thực hiện việc này không? Tôi cần phải làm chính xác điều này và tôi không thể tìm thấy một giải pháp. – dharag

+0

@dharag - Cuối cùng tôi đã thực hiện một giải pháp dựa trên phản chiếu của riêng mình bằng cách sử dụng FactoryBean để tạo ra các đối tượng mà tôi muốn. Tôi thấy không có giải pháp tích hợp. – RonK

27

Bạn có thể sử dụng SpEL và giữ chỗ và giá trị mặc định cho các cơ chế giữ chỗ với nhau như sau:

<bean name="myBean" class="some.Type"> 
    <property name="abc" value="${some.param:#{null}}"/> 
</bean> 
+0

Bạn đã trả lời câu hỏi này một lần :) (và cũng hơi khác một chút) – RonK

+1

Ồ, Có, nhưng câu trả lời mới hơn đơn giản hơn :) – MJM

+0

Đây là giải pháp tốt nhất cho tất cả các câu trả lời, thanks1 –

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