02. juli 2009 - 12:43Der er
6 kommentarer og 1 løsning
Mapping af to entitets-objekter
Hej eksperter.
Findes der en smart måde/værktøj hvorpå jeg kan "mappe" et entitets-objekt til et andet?
Dvs. jeg har et objekt med nogle attributter. Et andet system skal bruge disse informationer men vil have at objektet og attributterne hedder noget andet samt at værdierne evt. skal mappes over i andre attributter.
Derudover kan der løbende forekomme ændringer til hvorledes denne mapning skal fungere så jeg forestiller mig evt. en XML fil hvor man kan skrive hvilke attributter i det ene objekt, der skal mappes til andre attributter i det andet objekt.
Nu er det ikke indlysende for mig hvorfor det er bedre at have assignment i en XML config end i en Java source fil.
Men anyway: - jeg kender ikke noget faerdigt tool til dette - men det ville vaere relativt nemt at lave en af: - utility som compiler XML til Java source som saa compiles normalt - kode som runtime laeser XML og dynamisk genererer kode der laver konverteringen
Det med at bruge en tekstfil (xml) var blot tænkt således at man nemt kan ændre mapningen.
Men hvordan ville du lave det? Vil du skrive nogle flere punkter til det?
Problemstillingen var: Jeg har har et entity-objekt, værdierne derfra ønsker jeg mappet over i et andet objekt. Det kan dog sagtens være at det andet objekt ændrer struktur. Derfor må jeg ind og ændre klassen og re-kompilerer hver gang det sker. Kunne jeg mon blot skrive hvilke attributter der skal mappes i en tekstfil således at jeg ikke behøver at ændre sourcekoden direkte men blot denne tekstfil og derefter re-kompilerer?
public class ObjMap { public static void map(Object o1, Object o2, Properties p) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { for(Entry e : p.entrySet()) { Method put = (new PropertyDescriptor((String) e.getKey(), o2.getClass())).getWriteMethod(); Method get = (new PropertyDescriptor((String) e.getValue(), o1.getClass())).getReadMethod(); put.invoke(o2, get.invoke(o1)); } } public static void main(String[] args) throws Exception { Properties p = new Properties(); p.load(new FileInputStream("C:\\map.properties")); Foo o1 = new Foo(); o1.setA(123); o1.setB(456); Bar o2 = new Bar(); map(o1, o2, p); System.out.println(o2.getC() + " " + o2.getD()); } }
class Foo { private int a; private int b; public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } }
class Bar { private int c; private int d; public int getC() { return c; } public void setC(int c) { this.c = c; } public int getD() { return d; } public void setD(int d) { this.d = d; } }
(map metoden kan optimeres lidt da den reflecterer ved hver eneste kald)
Men ellers bør koden være relativ nem at overskue.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.