ModelMapper:匹配多个源属性层次结构

Biz*_*4ik 7 java modelmapper

我无法解决modelMapper错误。您有什么想法吗?

注意:在视图java.sql.Time中没有非参数构造函数,我没有找到比编写转换器更好的方法

org.modelmapper.ConfigurationException: ModelMapper configuration errors:

1) The destination property 
biz.models.CarWash.setSecondShift()/java.util.Date.setTime() matches 
multiple source property hierarchies:

biz.dto.CarWashDTO.getFirstShift()/java.time.LocalTime.getSecond()
biz.dto.CarWashDTO.getSecondShift()/java.time.LocalTime.getSecond()
Run Code Online (Sandbox Code Playgroud)

错误是由此代码造成的

@SpringBootTest
@RunWith(SpringRunner.class)
public class CarWashDTO2CarWash {

@Autowired
protected ModelMapper modelMapper;

@Test
public void testCarWashDTO2CarWash_allFiledShouldBeConverted(){
    CarWashDTO dto = CarWashDTO.builder()
            .name("SomeName")
            .address("SomeAddress")
            .boxCount(2)
            .firstShift(LocalTime.of(9, 0))
            .secondShift(LocalTime.of(20, 0))
            .phoneNumber("5700876")
            .build();

    modelMapper.addConverter((Converter<CarWashDTO, CarWash>) mappingContext -> {
        CarWashDTO source = mappingContext.getSource();
        CarWash destination = mappingContext.getDestination();
        destination.setId(source.getId());
        destination.setFirstShift(source.getFirstShift() == null ? null : Time.valueOf(source.getFirstShift()));
        destination.setSecondShift(source.getSecondShift() == null ? null : Time.valueOf(source.getSecondShift()));
        destination.setEnable(true);
        destination.setAddress(source.getAddress());
        destination.setBoxCount(source.getBoxCount());
        destination.setName(source.getName());
        destination.setDateOfCreation(source.getDateOfCreation());
        return destination;
    });

    final CarWash entity = modelMapper.map(dto, CarWash.class);
    assertNotNull(entity);
    assertEquals(2, entity.getBoxCount().intValue());
    assertEquals("SomeAddress", entity.getAddress());
    assertEquals("SomeName", entity.getName());
}
Run Code Online (Sandbox Code Playgroud)

}

modelmapper bean由下一个配置构建

@Bean
public ModelMapper modelMapper(){
    return new ModelMapper();
}
Run Code Online (Sandbox Code Playgroud)

Dto:

public class CarWashDTO {
private Long id;
private String name;
private String address;
private String phoneNumber;
private Integer boxCount;
private LocalTime firstShift;
private LocalTime secondShift;
private LocalDateTime dateOfCreation;
}
Run Code Online (Sandbox Code Playgroud)

实体(firstShift和secondShift具有java.sql.Time类型):

public class CarWash {
private Long id;
private String name;
private String address;
private String phoneNumber;
private Integer boxCount;
private Time firstShift;
private Time secondShift;
private LocalDateTime dateOfCreation;
private Boolean enable;
private Owner owner;
}
Run Code Online (Sandbox Code Playgroud)

小智 26

尝试 modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT)

  • 这是最好的答案。我仍然看到与以下内容的冲突:````modelMapper.getConfiguration().setAmbiguityIgnored(true);``` (2认同)

小智 8

这解决了我的问题: modelMapper.getConfiguration().setAmbiguityIgnored(true);

  • 此配置仅使 ModelMapper 跳过该字段。在这种情况下,CarWashDTO.id 字段在映射后将为空。 (2认同)

soc*_*ona 5

您需要在 Bean 初始化期间借助 PropertyMap 自定义 ModelMapper 配置: http://modelmapper.org/user-manual/property-mapping/

@Bean
public ModelMapper modelMapper(){
    ModelMapper mm = new ModelMapper();

    PropertyMap<CarWashDTO, CarWash> propertyMap = new PropertyMap<CarWashDTO, CarWash> (){
        protected void configure() {
            map(source.getId()).setId(null);
        }
    }

    mm.addMappings(propertyMap);
    return mm;
}
Run Code Online (Sandbox Code Playgroud)