我有一个这样的模型:
public class PersonDto {
private CarDto car;
public CarDto getCar() {
return car;
}
public void setCar(CarDto car) {
this.car = car;
}
public static class CarDto {
private String model;
private String color;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
}
VO是不可变的:
public class PersonVo {
private final CarDto car;
public PersonVo(CarDto car) {
super();
this.car = car;
}
public CarDto getCar() {
return car;
}
public static class CarDto {
private final String model;
private final String color;
public CarDto(String model, String color) {
super();
this.model = model;
this.color = color;
}
public String getModel() {
return model;
}
public String getColor() {
return color;
}
}
}
是否有使用
ModelMapper
提供程序将这种情况从Dto转换为Vo的简便方法?我无法使用
PersonVo
的一个提供程序来弄清楚它,因为在创建新对象时,我不知道如何解析CarDto
...public class PersonVoProvider implements Provider<PersonVo> {
public PersonVo get(org.modelmapper.Provider.ProvisionRequest<PersonVo> request) {
PersonDto source = PersonDto.class.cast(request.getSource());
return new PersonVo(car); ????????????
}
}
最佳答案
要将一个实例转换为另一个不变的实例,请执行以下步骤(摘要:1.创建Provider
,2。创建Converter
,3。将它们都添加到ModelMapper configuration
):
首先使用Provider
类创建一个AbstractProvider
,以避免实例化目标错误(Failed to instantiate instance of destination com.example.pregunta.PersonVo. Ensure that com.example.pregunta.PersonVo has a non-private no-argument constructor
)。您的Provider
应该实例化您的不变类(在您的情况下为PersonVo
),即使属性是最终的,也要具有所需的值,因为该实例化只是为了避免实例化错误。例如:
Provider<PersonVo> providerVo = new AbstractProvider<PersonVo>() {
@Override
protected PersonVo get() {
PersonVo.CarDto carDto = new PersonVo.CarDto("", "");
PersonVo personVo = new PersonVo(carDto);
return personVo;
}
};
然后,您需要使用源
Converter
和目标PersonDto
创建一个PersonVo
。用手将一个实例转换为另一个实例,例如下一个示例:Converter<PersonDto, PersonVo> converterDtoToVo = new Converter<PersonDto, PersonVo>() {
@Override
public PersonVo convert(MappingContext<PersonDto, PersonVo> context) {
PersonDto dto = context.getSource();
String color = dto.getCar().getColor();
String model = dto.getCar().getModel();
PersonVo.CarDto carVo = new PersonVo.CarDto(color, model);
PersonVo vo = new PersonVo(carVo);
return vo;
}
};
最后,需要将提供程序和转换器添加到您的
ModelMapper
实例配置中:ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setProvider(providerVo);
mapper.addConverter(converterDtoToVo);
测试
我已经在此示例中进行了尝试,并且效果很好:
//Instances
PersonDto dto = new PersonDto();
PersonDto.CarDto carDto = new PersonDto.CarDto();
carDto.setColor("blue");
carDto.setModel("Picasso");
dto.setCar(carDto);
PersonVo vo = mapper.map(dto, PersonVo.class);
System.out.println(vo);
输出:
PersonVo [汽车= CarDto [型号=蓝色,颜色=毕加索]]