私はそのような列挙型を持っています:
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;
}
}
文字列に変換する必要があります。その逆も同様です。 現在、カスタムコンバーターによって実行されます。しかし、ドーザーマッピングを介して実行したいと思います(可能な場合)。ブルドーザー会議へのマッピングを書かないと、
org.dozer.MappingException: Java.lang.NoSuchMethodException: by.dev.madhead.demo.test_Java.model.PartnershipIndicator.<init>()
例外。デフォルトのパブリックコンストラクターを列挙型に追加することはできません。だから、私は内部コードとvalueOfCode()/ toString()でトリックを書きました。それは動作しません。次に、それをdozerconfigにマッピングしました。
<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()を試しました。何も機能しません。列挙型から文字列への変換も機能しません。空の文字列を取得します。何か案は?
これがまだ問題であるかどうかはわかりませんが、検索する人には役立つかもしれません。しかし、これに対する実装されたソリューションは次のとおりです。
@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-langlibsからのものです。しかしそれ以外は、この問題を解決するための簡単な考察です。 CustomConverterを実装するクラスに追加してから、ドーザーマッピング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>
すべてのマッピングファイル(複数ある場合)間で構成をリストできるのは1回だけであることに注意してください。そうしないと、ドーザーが文句を言います。私が通常行うことは、簡単にするためにカスタムコンバーター構成を1つのファイルに配置することです。お役に立てれば!
Dozerにはデフォルトの列挙型から文字列へのマッピングはありません。 Dozerのドキュメントから データ型変換 を参照してください。したがって、2つのオプションがあります。