Java:ModelMapper不编译包含集合List的嵌套对象

时间:2017-03-27 14:55:57

标签: java spring maven modelmapper javax

我正在使用ModelMapper v0.7.7 我的课程如下所示:

public class ParentClassOne {

    protected String someValue1;
    protected String someValue2;

    protected ChildClassOne itemOne;

    public ChildClassOne getItemOne() {
        return itemOne;
    }

    public void setItemOne(ChildClassOne itemOne) {
        this.itemOne = itemOne;
    }

    ...setter and getter methods for the rest of fields...
}

public class ParentClassOne {
    ...this class contains the same elements like the first one...
}

我的ModelMapper配置如下所示:

ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STANDARD);
modelMapper.getConfiguration().setMethodAccessLevel(AccessLevel.PUBLIC);
modelMapper.getConfiguration().setFieldAccessLevel(AccessLevel.PROTECTED);

当我想将一个对象转换为另一个对象时,我使用以下源代码:

info.p2.ParentClassOne result = modelMapper.map(data, info.p2.ParentClassOne.class);

当然,这意味着数据是由 info.p1 包中的第一个类创建的对象。

当我执行这个源代码时,只有这些" String"变量(someValue1和someValue2)将被填充但变量" itemOne"即使我传递了包含所有属性的完整对象,它也将为null。

指示:这两个类是通过maven与org.apache.cxf生成的 - > wsdl2java包所以它们都包含特殊的" javax.xml"注释

EDIT1: 两个包中都存在类ChildClassOne。当ModelMapper尝试转换它时,它会识别出两个类中的这个变量由于不同的包而具有完全不同的类型,并且ModelMapper不会映射此变量。

字符串变量(someValue1,someValue2)也是一样,但两个类中的String类型相同,并且此类型存在于同一个包中,然后ModelMapper将映射它们。

当然我可以添加一些手动步骤来解决这个简单的例子,但在实际情况中,我有更复杂的对象,包含许多嵌套对象。

EDIT2: 我注意到的问题,我确实知道我什么时候提问,是我的ChildClassOne中的集合列表。 ModelMapper无法映射包含任何类型集合的任何对象。在我的课程列表中,如下所示:

public ChildClassOne {
    protected List<ChildAnyClass> children;

    ...getter method...
    Notice: ...there is no setter method for the list....
}

如果嵌套对象中没有集合,ModelMapper将映射所有这些集合,但在我的情况下,我在每个嵌套对象中都有集合。

1 个答案:

答案 0 :(得分:0)

我正在搜索并找到以下可以使用的解决方案:

ModelMapper modelMapper = new ModelMapper();

Converter<ObjectOne, ObjectTwo> converter = new Converter<ObjectOne, ObjectTwo>() {
    public ObjectTwo convert(MappingContext<ObjectOne, ObjectTwo> context) {

        ObjectTwo dest = new ObjectTwo();
        if (context.getSource() != null) {

            // Converts list from source object into the list of destination object
            Type listType = new TypeToken<List<ObjectTwo>>() {}.getType();
            List<ObjectTwo> items = modelMapper.map(context.getSource().getList(), listType);

            dest.getList().addAll(items);
            return dest;

        } else {
            return dest;
        }
    }
};

现在只需要将您的转换器添加到ModelMapper中,并附带以下源代码:

modelMapper.addConverter(converter);

如果您有一个或两个嵌套集合,这是一个很好的解决方案,但如果您有多个嵌套集合,那么您必须为每个集合编写转换器。

如果有人知道如何使用多个嵌套集合解决此问题,请与我们分享。