gpt4 book ai didi

java - Dozer 从 Set 映射到 List
转载 作者:行者123 更新时间:2023-12-01 10:04:21 24 4
gpt4 key购买 nike

我想将一组对象映射到枚举列表。我已经创建了一个自定义转换器来将枚举转换为其等效的字符串。当我尝试运行启动上述转换的 Junits 时,Dozer 会抛出以下错误:

org.dozer.MappingException: java.lang.NoSuchMethodException: 

例如:我想将 Set < Foo> 转换为 List< FOO>

class Foo{
private String FOO; // this contains same data as the enum FOO
private String foo1;
}

enum FOO {
A,B;
}

最佳答案

如果您能显示完整的堆栈跟踪、映射 xml、客户转换器和相关代码,那就更好了。我可以大胆猜测您收到 NoSuchMethodException 是因为您错误地使用了枚举构造函数。

但是,这里有一个 CustomConverter,它成功地将一组对象映射到枚举列表(我将枚举标记为“Bar”而不是“FOO”):

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

}

和映射 xml:

<?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>

关于java - Dozer 从 Set<Object> 映射到 List<ENUM>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36558376/

24 4 0