[英]Dozer String to enum mapping
我有這樣的枚舉:
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.<init>()
例外。 我不能將默認的公共構造函數添加到枚舉中,因為它是不可能的。 所以,我用內部代碼和valueOfCode()/ toString()寫了一個技巧。 這是行不通的。 然后,我在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>
這是行不通的。 我嘗試了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;
}
構建異常消息時的StrBuilder類來自apaches common-lang libs。 但除此之外,還有一個簡單的反思來解決這個問題。 只需添加到實現CustomConverter的類,然后在您的dozer映射xml文件中添加以下配置:
<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>
請注意,您只能在所有映射文件之間列出一次配置(如果您有多個),否則dozer會抱怨。 我通常做的是將我的自定義轉換器配置放在一個文件中以簡化操作。 希望這可以幫助!
Dozer中沒有String映射的默認枚舉。 請參閱Dozer文檔中的數據類型轉換 。 所以你有兩個選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.