我有一个Student
对象扩展Person
个对象。
public abstract class Person implements IIdentifiable {
private String contactNumber;
// other properties
public String getContactNumber() {
return contactNumber;
}
public void setContactNumber(String contactNumber) {
this.contactNumber = contactNumber;
}
}
public class Student extends Person {
private String studentNumber;
//Other properties
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
}
学生拥有财产studentNumber
,且人拥有财产contactNumber
。当我将Student对象映射到StudentDto
时,它会对给定的属性感到困惑。
public class StudentDto{
private String studentNumber;
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
}
仅在某些情况下发生这种情况。我想知道是什么原因
1) The destination property com.cinglevue.veip.web.dto.timetable.StudentDto.setStudentNumber() matches multiple source property hierarchies:
com.cinglevue.veip.domain.core.student.StudentProfile.getStudent()/com.cinglevue.veip.domain.core.Person.getContactNumber()
com.cinglevue.veip.domain.core.student.StudentProfile.getStudent()/com.cinglevue.veip.domain.core.Student.getStudentNumber()
答案 0 :(得分:2)
1。
您可以使用以下命令更改MatchingStrategies
:
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
PS:modelmapper隐式使用MatchingStrategies.STANDARD
但是它要求源端和目标端的属性名称标记必须精确匹配。
2。 在找到多个源属性层次结构时,告诉ModelMapper忽略映射:
modelMapper.getConfiguration().setAmbiguityIgnored(true);
答案 1 :(得分:1)
问到已经很久了。因为这里没有答案,所以我向您展示我的解决方案。
该问题是由目标属性名称引起的,让ModelMapper感到困惑。 因此,要解决该问题,我们需要执行两个步骤。 1.说ModelMapper忽略了可能引起混淆的内容。 2.指定指示映射以混淆属性。
详细代码在这里:
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setAmbiguityIgnored(true);
modelMapper.createTypeMap(Student.class, StudentDto.class)
.addMapping(Student::getStudentNumber, StudentDto::setStudentNumber);