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

标签 java mapstruct

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

// 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/

相关文章:

java - Mapstruct - 从多个集合映射到单个集合

java - MapStruct:如何过滤要使用的后映射方法?

java - 将参数传递给自定义映射函数

java - 如何在不使用 shell 脚本的情况下获取超时命令的输出

java - 无法在 myeclipse 上运行 Web 应用程序

Java最佳实践或是否有任何设计模式来保存与该类没有直接关系的数据

java - 为什么这个 MapStruct 生成的类不包含 import 语句?

java - java.util.Collections和java.util.Collection在Java中有什么关系吗?

java - 读取 IDOC 时如何控制事务(提交/回滚)

java - mapstruct 未在双向 OneToMany 上正确设置关系