gpt4 book ai didi

java - 与提供者和不可变对象(immutable对象)的深度映射

转载 作者:行者123 更新时间:2023-12-01 09:30:58 37 4
gpt4 key购买 nike

我有一个这样的模型:

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 Provider 将此场景从 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); ????????????
}
}

最佳答案

该示例使用 lombok 不可变对象(immutable对象)和 modelMapper 的嵌套不可变对象(immutable对象)解决了问题

唯一的事情是我们必须将 accessLevel 设置为 private 并将构造函数声明为 private 以保持不变性,lombok 通过注释为我们工作。请参阅下面的示例:

首先定义 modelMapper 将 accessLevel 设置为 private

 ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);

和不可变对象(immutable对象):

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Value
@Builder
public class UserDto {

private final Long id;

private final String uid;

private final String description;

private final boolean enabled;

@Singular
private final Set<GroupUserDto> userGroups;
}

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
public class GroupUserDto {

private Long id;

private String name;

private String description;

private String comments;

private boolean enabled;
}

最后,使用 Builder 父类调用 modelMapper.map 效果很好。所有字段都被映射,包括嵌套的不可变 dto

UserDto dto = modelMapper.map(user,UserDto.UserDtoBuilder.class).build();

关于java - 与提供者和不可变对象(immutable对象)的深度映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39407109/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com