不知道这是否仍然是一个问题,但可能有助于任何人搜索.但是这里实现了解决方案:
@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;
}
构建异常消息时的StrBuilder类来自common-lang libs.但除此之外,一个简单的反思来解决这个问题.只需添加一个实现CustomConverter的类,然后在你的dozer映射xml文件中添加以下配置:
java.lang.Enum
java.lang.String
请注意,您只能在所有映射文件之间列出配置(如果有多个映射文件),否则dozer会抱怨.我通常做的是将我的自定义转换器配置放在一个文件中以简化.希望这可以帮助!