O olurdu Tam yığın izlemesi, xml eşleştirmesi, müşteri dönüştürücü ve ilgili kodları göstermiş olsaydınız daha iyi oldu. Enum yapıcısını yanlış kullandığınız için NoSuchMethodException aldığınızı tahmin etmem tehlikesiyle karşı karşıya kalabilir.
public class EnumClassConverter implements CustomConverter{
public Object convert(Object dest, Object source, Class<?> arg2, Class<?> arg3) {
if (source == null)
return null;
if (source instanceof Set<?>){
Set<Foo> setOfFoos = (Set<Foo>) source;
List<Bar> listOfBars = new ArrayList<Bar>();
for (Foo f:setOfFoos){
if (f.getFOO()=="A") listOfBars.add(Bar.A);
else listOfBars.add(Bar.B);
}
return listOfBars;
}
else if (source instanceof List<?>){
List<Bar> listOfBars = (List<Bar>) source;
Set<Foo> setOfFoos = new HashSet<Foo>();
for (Bar b : listOfBars){
Foo f = new Foo();
if (b ==Bar.A){
f.setFOO("A");
}
else f.setFOO("B");
setOfFoos.add(f);
}
return setOfFoos;
}
else {
throw new MappingException("Converter EnumClassConverter "
+ "used incorrectly. Arguments passed in were:"
+ dest + " and " + source);
}
}
}
ve haritalama xml:
Ancak, burada başarıyla (yerine 'FON' arasında 'Bar' enum etiketlediğinize) çeteleler bir Listesine Nesnelerin bir Set eşleştiren bir CustomConverter var :
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>beans.FooContainer</class-a>
<class-b>beans.BarContainer</class-b>
<field custom-converter="converter.EnumClassConverter" >
<a>fooSet</a>
<b>listOfBars</b>
</field>
</mapping>
</mappings>