2011-11-25 17 views
15

tengo tal enumeración:del dormilón de cuerdas es posible enumerar los mapeo

public enum PartnershipIndicator { 
    VENDOR("VENDOR"), COPARTNER("COPARTNER"), BUYER("BUYER"); 

    String code; 

    private PartnershipIndicator(String code) { 
     this.code = code; 
    } 

    public String getCode() { 
     return code; 
    } 

    public static PartnershipIndicator valueOfCode(String code) { 
     for (PartnershipIndicator status : values()) { 
      if (status.getCode().equals(code)) { 
       return status; 
      } 
     } 
     throw new IllegalArgumentException(
      "Partnership status cannot be resolved for code " + code); 
    } 

    @Override 
    public String toString() { 
     return code; 
    } 
} 

necesito para convertirlo en cadena y viceversa. Ahora, se hace mediante un convertidor personalizado. Pero quiero hacerlo a través de asignaciones dozer (si es posible). Si no escribo las asignaciones a la confing dormilón, me sale

org.dozer.MappingException: java.lang.NoSuchMethodException: by.dev.madhead.demo.test_java.model.PartnershipIndicator.<init>() 

excepción. No puedo agregar el constructor público predeterminado a enum, ya que no es posible. Entonces, escribí un truco con código interno y valueOfCode()/toString(). No funciona. Entonces, lo he mapeado en configuración de dozer:

<mapping> 
    <class-a>java.lang.String</class-a> 
    <class-b create-method="valueOfCode">by.dev.madhead.demo.test_java.model.PartnershipIndicator</class-b> 
</mapping> 

No funciona. Intenté valueOfCode(), asignaciones unidireccionales. Nada funciona. La conversión de Enum to String tampoco funciona, obtengo cadenas vacías. Alguna idea?

+1

He agregado mi convertidor personalizado a dozer master. Entonces nadie de 5.4 no enfrentará este problema :) – madhead

+0

@all ¿Alguien puede ver esto [Pregunta] (http://stackoverflow.com/questions/27864640/dozer-string-to-date-field-level-mapping-for -a-list) – 09Q71AO534

Respuesta

19

No estoy seguro si esto todavía es un problema, pero tal vez ayuda para cualquiera que busque. Pero aquí está implementado la solución a esto:

@Override 
public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) { 
    if(source == null) 
     return null; 
    if(destinationClass != null){ 
     if(destinationClass.getSimpleName().equalsIgnoreCase("String")){ 
      return this.getString(source); 
     }else if(destinationClass.isEnum()){ 

      return this.getEnum(destinationClass, source); 

     }else{ 
      throw new MappingException(new StrBuilder("Converter ").append(this.getClass().getSimpleName()) 
         .append(" was used incorrectly. Arguments were: ") 
         .append(destinationClass.getClass().getName()) 
         .append(" and ") 
         .append(source).toString()); 
     } 
    } 
    return null; 
} 

private Object getString(Object object){ 
    String value = object.toString(); 
    return value; 
} 
private Object getEnum(Class<?> destinationClass, Object source){ 
    Object enumeration = null; 

    Method [] ms = destinationClass.getMethods(); 
    for(Method m : ms){ 
     if(m.getName().equalsIgnoreCase("valueOf")){ 
      try { 
       enumeration = m.invoke(destinationClass.getClass(), (String)source); 
      } 
      catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } 
      catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
      return enumeration; 
     } 
    } 
    return null; 
} 

La clase StrBuilder la hora de construir el mensaje de excepción es de los apaches libs comunes-Lang. Pero aparte de eso, un simple reflejo para resolver este problema. Sólo tiene que añadir a una clase que implementa CustomConverter y luego en el archivo XML de mapeo de empuje añade la siguiente configuración:

<configuration> 
    <custom-converters> 
     <converter type="com.yourcompany.manager.utils.dozer.converters.EnumStringBiDirectionalDozerConverter"> 
      <class-a>java.lang.Enum</class-a> 
      <class-b>java.lang.String</class-b> 
     </converter> 
    </custom-converters> 
</configuration> 

en cuenta que sólo puede enumerar una configuración una vez entre todos sus archivos de asignación (si tiene múltiples) de lo contrario Dozer se quejará. Lo que normalmente hago es colocar mis configuraciones de convertidor personalizadas en un archivo para simplificar. ¡Espero que esto ayude!

4

No hay una enumeración predeterminada para la asignación de cadenas en Dozer. Consulte Data type conversion desde Dozer documentos. Entonces usted tiene dos opciones:

  • Puede escribir un convertidor personalizado que use genéricos para manejar cualquier enumeración.
  • O bien, puede enviar un parche a Dozer para agregar enum < -> Cadena de mapeo a las asignaciones predeterminadas.
+0

Parece que esto sigue siendo cierto en 2018. El proyecto Dozer parece estar inactivo. Usamos ModelMapper en nuestro proyecto actual. –

Cuestiones relacionadas