Tôi bị kẹt khi chuyển đổi Java Bean
thành Map
. Có rất nhiều tài nguyên trên internet, nhưng tiếc là tất cả họ đều chuyển đổi các hạt đơn giản thành Maps. Những người thân của tôi rộng hơn một chút.Làm phẳng Java Bean thành Bản đồ
Có ví dụ đơn giản:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
Quan điểm của tôi là để sản xuất Map<String, Object>
đó, trong trường hợp này, là đúng với điều kiện sau:
map.containsKey("firstName")
map.containsKey("lastName")
map.containsKey("homeAddress.street") // street is String
map.containsKey("homeAddress.number") // number is int
map.containsKey("homeAddress.city") // city is String
map.containsKey("homeAddress.zipcode") // zipcode is String
map.containsKey("age")
Tôi đã cố gắng sử dụng Apache Commons BeanUtils
. Cả hai cách tiếp cận BeanUtils#describe(Object)
và BeanMap(Object)
tạo Bản đồ có "mức độ sâu" là 1 (nghĩa là chỉ có "homeAddress"
khóa, giữ đối tượng MyHomeAddress
làm giá trị). Phương pháp của tôi nên nhập các đối tượng sâu hơn và sâu hơn cho đến khi nó đáp ứng một kiểu nguyên thủy (hoặc Chuỗi), sau đó nó sẽ ngừng đào và chèn khóa, tức là "order.customer.contactInfo.home"
.
Vì vậy, câu hỏi của tôi là: làm thế nào nó có thể được easliy thực hiện (hoặc là đã có dự án hiện tại mà sẽ cho phép tôi làm điều đó)?
cập nhật
tôi đã mở rộng Radiodef câu trả lời bao gồm cũng Collections, Maps Mảng và Enums:
private static boolean isValue(Object value) {
final Class<?> clazz = value.getClass();
if (value == null ||
valueClasses.contains(clazz) ||
Collection.class.isAssignableFrom(clazz) ||
Map.class.isAssignableFrom(clazz) ||
value.getClass().isArray() ||
value.getClass().isEnum()) {
return true;
}
return false;
}
Bạn có thể không có nghĩa là "nguyên thủy", vì 'Chuỗi' không phải là nguyên thủy (nó mở rộng' Đối tượng'). Vì vậy, bạn cần một cách để nói thuật toán mà các lớp học đi qua, và cái nào để lấy làm giá trị, vì vậy có lẽ sẽ không phải là cách để làm điều này mà không có một số loại cấu hình (có thể sử dụng chú thích). – Tonio
Điều này có thể được thực hiện với sự phản chiếu và đệ quy, bạn gần như chắc chắn phải tự viết nó. Lưu ý rằng tại thời điểm này câu hỏi sẽ bị đóng vì yêu cầu đề xuất thư viện là không có chủ đề. – Radiodef
Tonio, Radiodef - cảm ơn đề xuất của bạn, tôi đã chỉnh sửa bài đăng của mình. –