gpt4 book ai didi

Java:ModelMapper 不编译嵌套集合列表中的数据

转载 作者:行者123 更新时间:2023-11-30 06:49:24 29 4
gpt4 key购买 nike

我的结构类似于下面的:

public class FirstObject {
private List<SecondObject> myListOne;

...only getter method...
...no setter method for the list due to it is generated from wsdl
}

public class SecondObject {
private List<ThirdObject> myListTwo;

...only getter method...
...no setter method for the list due to it is generated from wsdl
}

public class ThirdObject {
private String firstName;
private String lastName;

...setters and getters...
}

主要问题是列表的设置方法。如果您尝试使用 PropertyMap 甚至使用 Providers,则必须使用 setter 方法,而我无法手动创建它们,因为每次运行 mvn eclipse:eclipse 命令时,所有对象都会从 wsdl 重新生成。

更新:

您可以在以下链接找到我的源代码: https://github.com/ervinfetic/modelmapper-issue-one

有什么解决方案如何使用转换器进行此操作吗?

最佳答案

如果您无法使用 setter,您可以将 ModelMapper 配置为按字段访问。只需将 FieldMatching 和 FieldAccessLevel 启用为私有(private),就像列表属性一样

modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(AccessLevel.PRIVATE);

示例:

FirstObject:

public class FirstObject {

private String name;

private List<FirstObjectList> objectList = new ArrayList<FirstObjectList>();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<FirstObjectList> getObjectList() {
return objectList;
}
}

FirstObjectList:

public class FirstObjectList {

private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

}

因此,我们希望将 FirstObject 映射到具有完全相同结构(属性)的 SecondObject 类:

SecondObject:

public class SecondObject {

private String name;

private List<SecondObjectList> objectList;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<SecondObjectList> getObjectList() {
return objectList;
}

}

SecondObjectList:

public class SecondObjectList {

private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

然后我们需要创建 ModelMapper 实例并将其配置为字段匹配和私有(private)访问级别。

public void test(){
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setFieldMatchingEnabled(true);
mapper.getConfiguration().setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);


FirstObject firstObject = new FirstObject();
firstObject.setName("Hola");

FirstObjectList firstObjectList = new FirstObjectList();
firstObjectList.setId("1");

firstObject.getObjectList().add(firstObjectList);

SecondObject second = mapper.map(firstObject, SecondObject.class);

assertEquals(firstObject.getName(), second.getName());

assertEquals(firstObject.getObjectList().size(), second.getObjectList().size());
assertEquals(firstObject.getObjectList().get(0).getId(), second.getObjectList().get(0).getId());
}

所有内容都已完美映射。所以它有效。

  • 输出:

SecondObject{name='Hola', objectList=[SecondObjectList{id='1'}]}

但是,如果尚未启用 FieldMatching 或将字段访问级别设置为“私有(private)”,则您的列表将不会被映射:

  • 输出:

SecondObject{name='Hola', objectList=null}

更新

如果您有嵌套列表,您可以将命名约定设置为更改器(mutator)以避免多重匹配错误,只需像下面这样配置即可:

 modelMapper.getConfiguration()
.setSourceNamingConvention(NamingConventions.JAVABEANS_MUTATOR);
<小时/>

否则,如果您不想通过字段访问来完成,您可以创建一个Converter来处理这种匹配:

public class ListConverter implements Converter<List<SecondObject>, List<ThirdObject>> {

@Override
public List<ThirdObject> convert(MappingContext<List<SecondObject>, List<PromoConditionEntity>> context) {
//A java 8 mapping example
return context.getSource()
.stream()
.map(this::convertToThirdObject)
.collect(Collectors.toList());
}

private ThirdObject convertToThirdObject(SecondObject s) {
//your impl map SecondObject to ThirdObject
...
}
}

最后,不要忘记将转换器添加到您的模型映射器实例中:

modelMapper.addConverter(new ListConverter());

关于Java:ModelMapper 不编译嵌套集合列表中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43115191/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com