2010-04-08 34 views
12

Sử dụng các nút công cụ của Commons Tôi muốn biết cách yêu cầu bất kỳ trình chuyển đổi nào nói Trình biến đổi dữ liệu bỏ qua các giá trị null và sử dụng giá trị rỗng như mặc định. Như một ví dụ xem xét một lớp công chúng,Làm thế nào để yêu cầu BeanUtils bỏ qua các giá trị rỗng

public class X { 
    private Date date1; 
    private String string1; 
    //add public getters and setters 
} 

và convertertest tôi như,

public class Apache { 

    @Test 
    public void testSimple() throws Exception { 
     X x1 = new X(), x2 = new X(); 
     x1.setString1("X"); 
     x1.setDate1(null); 
     org.apache.commons.beanutils.BeanUtils.copyProperties(x2, x1); 
     //throws ConversionException 
     System.out.println(x2.getString1()); 
     System.out.println(x2.getDate1()); 
    } 
} 

ở trên ném một NPE kể từ ngày xảy ra là null. Điều này trông một kịch bản rất nguyên thủy với tôi mà nên được xử lý theo mặc định (như trong, tôi mong đợi x2 có giá trị null cho ngày1). Các doco nói với tôi rằng tôi có thể yêu cầu converter để làm điều này. Ai đó có thể chỉ cho tôi như là cách tốt nhất để làm điều này?

Tôi không muốn giữ lại Trình chuyển đổi và isUseDefault() thành true vì sau đó tôi phải thực hiện nó cho tất cả Ngày, Enum và nhiều trình biến đổi khác!

+0

http://commons.apache.org/proper/commons-beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/ converters/DateConverter.html liên kết của bạn bị hỏng – VedX

Trả lời

33

Rõ ràng nó trông giống như, có một cách để nói với ConvertUtils để không ném ngoại lệ trên giá trị null mà là đạt được bằng cách gọi

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0); 
+0

Để làm rõ, bạn nên chạy dòng này trước khi bạn chạy phương thức copyProperties. –

1

Gần đây tôi đã gặp sự cố này và chỉ chuyển đổi biến của tôi thành chuỗi để tránh lỗi này và chuyển đổi trở lại ngày cần thiết. Không phải là giải pháp thanh lịch nhất, nhưng để đơn giản và tránh những vấn đề như thế này, đó là một giải pháp khả thi. Các caveat khác là BeanUtils sẽ bắn ra đó là phương pháp trước khi các lớp học của tôi sẽ tải, vì vậy tôi đã chọn cho điều này chứ không phải là một giải pháp phức tạp hơn cho vấn đề bằng cách sử dụng bộ nạp lớp tùy chỉnh.

Nhân tiện, trước câu 1.8.0, BeanUtils sẽ bỏ qua các giá trị null này.

Xem liên kết này: No value specified for 'Date' when the field is a java.util.Date with a null value để biết giải thích chi tiết.

10

Giải pháp tốt nhất là cập nhật cho BeanUtils 1.9.0, vì vấn đề này là cố định như bạn có thể thấy ở đây https://issues.apache.org/jira/browse/BEANUTILS-454

+4

Sự cố này xảy ra với tôi và tôi đang sử dụng phiên bản 1.9.2 của hạt đậu phộng. – Marc

+0

Tôi đang sử dụng phiên bản 1.9.2 và hạ cấp xuống 1.9.0 cho dự án của mình. Vấn đề đã không được giải quyết. –

+1

Tuyệt vời! Nó giải quyết vấn đề của tôi. –

0

Tôi hơi ngạc nhiên rằng đó là một trường hợp đơn giản như thiết lập một giá trị null trong một bean, như thế này :

BeanUtils.setProperty(pojo, "date", null); 

gây ra hành vi lỗi, như được mô tả ở trên.

Đối với những gì nó có giá trị, đây là cách giải quyết của tôi:

import org.apache.commons.beanutils.BeanMap; 

BeanMap beanMap = new BeanMap(pojo); 
Method writeMethod = beanMap.getWriteMethod("date"); 
writeMethod.invoke(pojo, null); 
Các vấn đề liên quan