我有一个这样的模型:

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 [型号=蓝色,颜色=毕加索]]

07-26 00:40