Dozer String到枚举映射

我有这样的枚举:

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

我需要将其转换为String,反之亦然。 现在,它由自定义转换器完成。 但我想通过推土机映射(如果有可能)这样做。 如果我没有写任何映射到推土机confing,我得到

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

例外。 我无法将默认的公共构造函数添加到枚举中,因为它是不可能的。 所以,我用内部代码和valueOfCode()/ toString()写了一个技巧。 这是行不通的。 然后,我在dozer配置中映射它:

  java.lang.String by.dev.madhead.demo.test_java.model.PartnershipIndicator  

这是行不通的。 我尝试了valueOfCode(),单向映射。 什么都行不通。 Enum to String转换也不起作用,我得到空字符串。 有任何想法吗?

不确定这是否仍然是一个问题,但也许对任何搜索的人都有帮助。 但是这里实现了解决方案:

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

构建exception消息时的StrBuilder类来自apaches common-lang libs。 但除了那个简单的反思就解决了这个问题。 只需添加到实现CustomConverter的类,然后在dozer映射xml文件中添加以下配置:

    java.lang.Enum java.lang.String    

请注意,您只能在所有映射文件之间列出一次配置(如果您有多个),否则推土机会抱怨。 我通常做的是将我的自定义转换器配置放在一个文件中以简化操作。 希望这可以帮助!

Dozer中没有String映射的默认枚举。 请参阅Dozer文档中的数据类型转换 。 所以你有两个选择:

  • 您可以编写一个使用generics来处理任何枚举的自定义转换器。
  • 或者,您可以向Dozer提交补丁,以将枚举< - > String映射添加到默认映射。