我无法解决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()
错误是由此代码
产生的@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());
}
}
modelmapper bean由下一个配置构建
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
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;
}
实体(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;
}
答案 0 :(得分:3)
这解决了我的问题:
maxOf
答案 1 :(得分:3)
尝试modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT)
答案 2 :(得分:0)
您需要在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;
}
答案 3 :(得分:0)
在询问问题时,我不确定ModelMapper
的情况如何,但是使用转换器应该很简单。无需为整个类实现转换器,而是将其实现为实际需要转换的类型。像这样:
public static Converter<LocalTime, Time> timeConverter = new AbstractConverter<>() {
@Override
protected Time convert(LocalTime source) {
return null == source ? null : Time.valueOf(source);
}
};
那只是为了:
mm.addConverter(timeConverter);
猜猜是否使用Spring或EJB,您知道如何将其添加到配置中。