Reactor: Как преобразовать поток объектов в поток объектов DTO - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть объект User и объект Role. Поля не важны, кроме того факта, что у сущности User есть поле role_id, соответствующее идентификатору его соответствующей роли. Поскольку Spring Data R2DBC не создает никаких отношений между сущностями, я перехожу к подходу DTO. Я очень плохо знаком с R2DBC и реактивным программированием в целом, и я не могу понять, как преобразовать метод findAll () моего репозитория Flux<User>, возвращающий меня к Flux<UserDto>. Мой класс UserDto чрезвычайно прост:

@Data
@RequiredArgsConstructor
public class UserDto 
{
    private final User user;

    private final Role role;
}

Вот класс UserMapper, который я пытаюсь создать:

@Service
@RequiredArgsConstructor
public class UserMapper 
{
    private final RoleRepository roleRepo;

    public Flux<UserDto> map(Flux<User> users)
    {
        //???
    }
}

Как я могу заставить этот преобразователь преобразовать Flux<User> вFlux<UserDto> с соответствующей ролью пользователя?

Спасибо!

1 Ответ

2 голосов
/ 04 ноября 2019

Если у вашего RoleRepository есть метод findById() или аналогичный для нахождения Role по его идентификатору, а у вашего пользовательского объекта есть getRoleId(), вы можете просто сделать это с помощью стандартного вызова карты:

return users.map(u -> new UserDto(u, roleRepo.findById(u.getRoleId())));

Или в случае, когда findById() возвращает Mono:

return users.flatMap(u -> roleRepo.findById(u.getRoleId()).map(r -> new UserDto(u, r)));

Вы, конечно, можете добавить дополнительные проверки, если возможно, что getRoleId() может вернуть ноль.

...