2012-06-19 14 views
9

Ho un sacco di classi Java di terze parti che utilizzano nomi di proprietà diverse per quello che sono essenzialmente la stessa proprietà:nomi di proprietà di fagioli Canonicalizing Java

public class Foo { 
    public String getReferenceID(); 
    public void setReferenceID(String id); 
    public String getFilename(); 
    public void setFilename(String fileName); 
} 

public class Bar { 
    public String getRefID(); 
    public void setRefID(String id); 
    public String getFileName(); 
    public void setFileName(String fileName); 
} 

mi piacerebbe essere in grado di affrontare questi in un modulo canonicalized, in modo che io possa trattare polimorfico, e in modo che io possa fare cose con Apache BeanUtils piace:

PropertyUtils.copyProperties(object1,object2); 

Chiaramente sarebbe banale scrivere un adattatore per ogni classe ...

public class CanonicalizedBar implements CanonicalizedBazBean { 
    public String getReferenceID() { 
     return this.delegate.getRefID(); 
    } 
    // etc. 
} 

Ma mi chiedo se ci sia qualcosa di più generalizzato e dinamico? Qualcosa che richiederebbe una mappa uno-a-molti delle equivalenze dei nomi delle proprietà e una classe delegata e produrrebbe l'adattatore?

risposta

6

ho mai usato, ma penso che tu sia alla ricerca di Dozer:

Dozer è un Java Bean a Java Bean mapper che copia ricorsivamente i dati da un oggetto all'altro. In genere, questi Java Beans saranno di tipo diversi.

Il bulldozer supporta la mappatura semplice delle proprietà, la mappatura dei tipi complessi, la mappatura bidirezionale , la mappatura implicita-esplicita e la mappatura ricorsiva . Ciò include la mappatura degli attributi di raccolta che anche a devono essere mappati a livello di elemento.

Dozer non supporta solo la mappatura tra i nomi degli attributi, ma anche la conversione automaticamente tra i tipi. La maggior parte degli scenari di conversione è supportata, ma Dozer consente anche di specificare le conversioni personalizzate tramite XML.

+0

Grazie. Sembra fare il lavoro esatto senza stadi intermedi indesiderati. – slim

4
  1. prima opzione è Dozer.

  2. La seconda opzione è Smooks Framework con un tweak. Sarà utile usare il mappatore grafico di Smook.

  3. Un'altra opzione sarebbe XStream con Mapper personalizzato.

2

forse qualcosa di simile:

public class CanonicalizedBar implements CanonicalizedBazBean { 
public String getReferenceID() { 
    Method m = this.delegate.getClass().getDeclaredMethod("getReferenceID"); 
    if(m == null) 
     m = this.delegate.getClass().getDeclaredMethod("getRefID"); 
    ... 
    return m.invoke(); 
} 
// etc. 
} 
2

Anche se, io personalmente non ho mai usato. Ho notato che un progetto chiamato orika ha le migliori prestazioni e la capacità di comprendere automaticamente molti di questi mapping. In ogni caso supporta anche i mapping personalizzati e utilizza il codice generato per definire implicitamente gli adattatori.

È anche possibile definire un programma di mappatura personalizzato, ovvero se si sa come canonizzare i nomi dei membri è possibile utilizzare tale conoscenza per creare una mappatura vera per tutti gli oggetti.per esempio:

DefaultFieldMapper myDefaultMapper = new DefaultFieldMapper() { 
    public String suggestMapping(String propertyName, Type<?> fromPropertyType) { 
     // split word according to camel case (apache commons lang) 
     String[] words= StringUtils.splitByCharacterTypeCamelCase(propertyName); 
     if(words[0].length() > 6) { 
     // trim first camel-cased word of propery name to 3 letters 
     words[0]= words[0].substring(0,2); 
     return StringUtils.join(words); 
     } else { 
     // remains unchanged 
     return propertyName; 
     } 
    } 
} 

mapperFactory.registerDefaultFieldMapper(myDefaultMapper); 
1

non ho fatto molto con esso, ma si può essere in grado di utilizzare Aspect Oriented Programming per fare questo.

Cosa dovresti essere in grado di fare Penso che aggiungere un metodo a ciascuna delle classi che internamente chiama il metodo reale. Vedi questo article a circa metà strada parla di mixin.

AspectJ è probabilmente l'implementazione più popolare.

Problemi correlati