如何将 Dto 修补到实体?

Pik*_*chu 5 java spring jpa dto spring-boot

我有一个接受 dto 对象的控制器。我需要更改 dto 对象中存在的字段。

@PatchMapping(value = "/update/{uuid}")
    public ResponseEntity<UserDto> update(
            @RequestBody UserDto userDto,
            @PathVariable("uuid")UUID uuid) throws UserNotFoundException {           
        User updatedUser = userService.update(
                userMapper.userDtoToUser(userDto),
                uuid
        );           
        return .....
    }
Run Code Online (Sandbox Code Playgroud)

但 userService 只能接受实体。我需要使用映射器 dto -> 实体。但是实体不能有 dto 中的空字段(假设您只需要更改一个字段)。在这种情况下该怎么办?我知道控制器不应该包含逻辑

Edu*_*elo 0

您可以使用反射来检查 null 属性和BeanUtils进行复制

在 Spring 中,这将是我检查空属性的方式

public static String[] getNullPropertyNames (Object source) {
    final BeanWrapper src = new BeanWrapperImpl(source);
    PropertyDescriptor[] pds = src.getPropertyDescriptors();

    Set<String> emptyNames = new HashSet<>();
    for(PropertyDescriptor pd : pds) {
        Object srcValue = src.getPropertyValue(pd.getName());
        if (srcValue == null) emptyNames.add(pd.getName());
    }
    return emptyNames.toArray(new String[0]);
}
Run Code Online (Sandbox Code Playgroud)

然后进行复制

User updatedUser = new User();
BeanUtils.copyProperties(userDto, updatedUser, getNullPropertyNames(userDto));
Run Code Online (Sandbox Code Playgroud)