2012-06-19 12 views
9

Tengo un montón de terceros clases Java que utilizan diferentes nombres de propiedades por lo que son esencialmente la misma propiedad:canonicalizing Java nombres de propiedades frijol

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); 
} 

Me gustaría ser capaz de hacer frente a estos en una forma canónica, de modo que pueda tratarlos polimórfica, y por lo que puedo hacer cosas con Apache BeanUtils gustan:

PropertyUtils.copyProperties(object1,object2); 

claro que sería trivial para escribir un adaptador para cada clase ...

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

Pero me pregunto ¿hay algo más generalizado y dinámico? ¿Algo que tomaría un mapa uno a muchos de las equivalencias de nombre de propiedad, y una clase de delegado, y produciría el Adaptador?

Respuesta

6

nunca he utilizado, pero creo que está buscando Dozer:

Dozer es un Java Bean a Java Bean que mapeador copia recursivamente datos de un objeto a otro. Típicamente, estos Java Beans serán de diferentes tipos complejos.

Dozer admite mapeo simple de propiedades, mapeo de tipos complejos, mapeo bidireccional , mapeo implícito-explícito, así como mapeo recursivo. Esto incluye atributos de colección de mapeo que también necesitan mapeo a nivel de elemento.

Dozer no solo admite la asignación entre nombres de atributos, sino también convirtiendo automáticamente entre tipos. La mayoría de los escenarios de conversión son admitidos de fábrica, pero Dozer también le permite especificar conversiones personalizadas a través de XML.

+0

Gracias. Parece hacer el trabajo exacto sin etapas intermedias no deseadas. – slim

4
  1. primera opción es Dozer.

  2. La segunda opción es Smooks Marco con un ajuste. Será beneficioso usar el mapeador gráfico de Smook.

  3. Otra opción sería XStream con un Mapper personalizado.

2

tal vez algo como lo siguiente:

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

Aunque, yo personalmente nunca lo han utilizado. Me di cuenta de que un proyecto llamado orika se considera que tiene el mejor rendimiento y la capacidad de comprender automáticamente muchas de esas asignaciones. En cualquier caso, también admite asignaciones personalizadas y utiliza código generado para definir implícitamente los adaptadores.

También puede definir un asignador personalizado, es decir, si sabe cómo canonizar los nombres de los miembros, puede usar ese conocimiento para crear una asignación que sea verdadera para todos sus objetos.por ejemplo:

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

no he hecho mucho con él, pero es posible que pueda utilizar Aspect Oriented Programming para hacer esto.

Lo que debería poder hacer, creo que es agregar un método a cada una de las clases que internamente llama al método real. Ver esto article a mitad de camino habla de mixins.

AspectJ es probablemente la implementación más popular.

Cuestiones relacionadas