Вот статья о Dozer: https://www.baeldung.com/dozer. Это картограф, который использует отражение для отображения полей с одинаковыми именами из одного объекта в другой (совершенно не связанного класса).
Мне было интересно,это работает гибко с закрытыми полями, получателями и установщиками.То есть
Будет ли private String a
отображаться на private String a
другого объекта без использования геттеров или сеттеров?
Что если только одинсторона имеет геттер или сеттер (а приватное поле имеет другое имя, чтобы убедиться, что оно не имеет прямого доступа к приватным полям)?
Что если у одного есть геттер, а у другого сеттерза полное несоответствие приватных полей?(Но имена геттеров и сеттеров совпадают.)
Я написал тестовую программу для запуска в https://www.jdoodle.com/online-java-compiler:
import org.dozer.DozerBeanMapper;
public class Main {
public static class MySource {
// a -> a
private String a;
// getB() -> b
private String hidden_b;
public String getB() { return hidden_b; }
// c -> setC(c)
private String c;
// getD() -> setD(d)
private String hidden_d;
// proper getters and setters on both sides
private String proper;
public String getProper() { return proper; }
// public void setProper(String proper_) { proper = proper_; }
public MySource() {
a = "A Room with a View";
hidden_b = "The Bridge of San Luis Rey";
c = "Civilwarland in Bad Decline";
hidden_d = "Darkness at Noon";
proper = "This should copy, at minimum.";
}
public void print() {
System.out.println("Source");
System.out.println("================================");
System.out.println("a = " + a);
System.out.println("hidden_b = " + hidden_b);
System.out.println("c = " + c);
System.out.println("hidden_d = " + hidden_d);
System.out.println("--------------------------------");
System.out.println("proper = " + proper);
System.out.println("");
}
}
public static class MyTarget {
private String a;
private String b;
private String hidden_c;
private String hidden_e;
public void setC(String param) { hidden_c = param; }
public void setD(String param) { hidden_e = param; }
private String proper;
// public String getProper() { return proper; }
public void setProper(String proper_) { proper = proper_; }
public MyTarget() {}
public void print() {
System.out.println("Target");
System.out.println("================================");
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("hidden_c = " + hidden_c);
System.out.println("hidden_e = " + hidden_e);
System.out.println("--------------------------------");
System.out.println("proper = " + proper);
System.out.println("");
}
}
public static void main(String args[]) {
MySource s = new MySource();
s.print();
System.out.println("Now dozing...");
System.out.println("");
MyTarget t = new DozerBeanMapper().map(s, MyTarget.class);
t.print();
}
}
Обратите внимание, что для запуска приведенного выше кода вынеобходимо добавить зависимость maven:
Group ID: net.sf.dozer
Artifact ID: dozer
Version: 5.5.1
А также вы должны попытаться выполнить несколько раз из-за случайных таймаутов в зависимости от того, загружается ли зависимость достаточно быстро.
В любом случае, мой вывод был:
Source
================================
a = A Room with a View
hidden_b = The Bridge of San Luis Rey
c = Civilwarland in Bad Decline
hidden_d = Darkness at Noon
--------------------------------
proper = This should copy, at minimum.
Now dozing...
Target
================================
a = null
b = null
hidden_c = null
hidden_e = null
--------------------------------
proper = This should copy, at minimum.
Итак, похоже, что Dozer only работает через геттер на источнике и сеттер на цели, что разочаровывает.Или я не правильно его использую!
Есть ли способ сделать Dozer более гибким?Или другая библиотека картографов, которая может достичь этого?