gpt4 book ai didi

java - 防止更新时在 Mapstruct 中进行空检查

转载 作者:行者123 更新时间:2023-12-05 07:27:14 25 4
gpt4 key购买 nike

我正在努力处理表单更新。请考虑这个例子:

// Entity with which I need to perform CRUD operations
public class User {
private String name;
private String email;
private String phone;
private String address;
}

我发送给 UI 的是 UserDTO:

public class UserDTO {
private String name;
private ContactDataDTO contactDataDTO;
}

public class ContactDataDTO {
private String email;
private String phone;
private String address;
}

我的映射器:

@Mapper
public interface UserMapper {

@Mappings({
@Mapping(source="email", target="contactDataDTO.email"),
@Mapping(source="phone", target="contactDataDTO.phone"),
@Mapping(source="address", target="contactDataDTO.address")
})
UserDTO userToUserDTO(User user);

@InheritInverseConfiguration
User updateUserFromUserDTO(UserDTO userDTO, @MappingTarget User user);

}

userToUserDTO() 按预期工作,但生成的 userDTOToUser() 对我来说似乎很奇怪:

@Override
public User updateUserFromUserDTO(UserDTO userDTO, User user) {
if ( userDTO == null ) {
return null;
}

String address = userDTOContactDataDTOAddress( userDTO );
if ( address != null ) {
user.setAddress( address );
}
String phone = userDTOContactDataDTOPhone( userDTO );
if ( phone != null ) {
user.setPhone( phone );
}
String email = userDTOContactDataDTOEmail( userDTO );
if ( email != null ) {
user.setEmail( email );
}
user.setName( userDTO.getName() );

return user;
}

有问题的用例:

  1. 填写用户的所有字段。
  2. 再次打开表格并清除电话字段。
  3. 这意味着我将像这样向后端发送 smth:

userDTO: {
name: 'John Doe';
contactDataDTO: {
email: 'johndoe@gmail.com',
phone: null,
address: 'Home'
}
}

因此,就我在生成的代码中对它进行空检查而言,user.phone 不会更新。


我认为 NullValueCheckStrategy 是我需要的,但是没有适合我的选项。目前,我看到的唯一选择是编写自己的 userDTOToUser() 实现,不进行空值检查。也许您可以建议更好的解决方案,因为对我来说,从具有非原始源的 DTO 进行目标更新的任何映射器中都可能发生这个问题。

可运行演示:https://repl.it/@aksankin/SlateblueUnimportantStack

非常感谢。

最佳答案

如果您希望 null 对您有一定的值(value),那么您正在寻找 source presence checking .然后,您可以在 DTO 的 setPhone 中控制它是否已设置,并添加将使用该标志的 hasPhone。然后MapStruct在设置值的时候会使用presence check方法。

关于java - 防止更新时在 Mapstruct 中进行空检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037352/

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