2011-11-28 44 views
15

Tôi nhận thấy rằng BeanUtils.copyProperties (dest, src) có một hiệu ứng phụ lạ. Tất cả null Integers (có thể là Long, Date v.v.) chuyển đổi thành 0 trong cả hai đối tượng: nguồn (sic!) Và đích. Version: commons-beanutils-1.7.0BeanUtils.copyProperties chuyển đổi số nguyên null thành 0

javadoc:

giá trị tài sản Sao chép từ đậu nguồn gốc đến bean điểm đến cho tất cả trường hợp tên thuộc tính đều giống nhau.

Ví dụ:

class User { 
    Integer age = null; 
    // getters & setters 
} 
... 
User userDest = new User(); 
User userSrc = new User(); 
BeanUtils.copyProperties(userDest, userSrc); 
System.out.println(userDest.getAge()); // 0 
System.out.println(userSrc.getAge()); // 0 

Nó có thể được rất nhiều lỗi mà đối tượng nguồn thực sự sửa đổi. Giải pháp tốt nhất để tạo bản sao "thực" của đối tượng với giá trị null là gì.

+0

Phiên bản nào của beanUtils? Tôi đã có một số vấn đề với lỗi thời – Dewfy

+0

commons-beanutils-1.7.0, được thêm vào bài đăng – smas

Trả lời

14

Ok tôi đã tìm thấy tuy nhiên this post

Có một sự khác biệt lớn giữa hai loại cổ phiếu này mà tôi đi qua trong khi sử dụng các lớp: BeanUtils làm một loại chuyển đổi tự động và PropertyUtils không.

Ví dụ: với BeanUtils, bạn có thể đặt thuộc tính hai giá trị bằng cách cung cấp Chuỗi. BeanUtils sẽ kiểm tra loại tài sản và chuyển đổi chuỗi thành một đôi. Với PropertyUtils, bạn luôn có để cung cấp đối tượng giá trị cùng loại với thuộc tính, do đó, trong ví dụ này là gấp đôi.

chuyển đổi tự động là không cần thiết trong trường hợp này, sự lựa chọn như vậy tốt hơn là PropertyUtils lớp

14

Kiểm tra http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/ConvertUtilsBean.html nó cho biết mặc định cho chuyển đổi nguyên là 0. Điều này là do loại đích ở đây là int nguyên thủy hoặc int tham chiếu và int nguyên thủy không thể được đặt thành rỗng.

Bạn có thể ghi đè trình chuyển đổi cho Số nguyên và thay thế bằng trình biến đổi có giá trị mặc định bằng không.

UPDATE: Cách sử dụng

import org.apache.commons.beanutils.converters.IntegerConverter; 

IntegerConverter converter = new IntegerConverter(null); 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 
beanUtilsBean.getConvertUtils().register(converter, Integer.class); 

Hãy nhìn vào các mã nguồn cho IntegerConverter - bạn thiết lập giá trị mặc định trong các nhà xây dựng.

+0

Âm thanh như giải thích. Vì vậy, những gì tôi cần làm là thay thế/sửa đổi bộ chuyển đổi này để trả về giá trị mặc định null – smas

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