Mutiny — объединить Uni и Multi на основе бизнес-логики
Я новичок в реактивном программировании. Пожалуйста, помогите в достижении ниже в Mutiny.
У меня есть класс DTO
public class UserAppSessionDto{
private UserDto user;
private List<OrgDto> userOrgs;
private List<AppDto> userApps;
}
и 3 метода обслуживания, один возврат
Uni
и другие возвращаются
Multi
.
Uni<UserDto> getUserByOrgUserId(Integer orgUserId);
Multi<AppDto> getUserApps(Integer orgUserId);
Multi<RoleDto> getUserRoles(Integer orgUserId);
Мне нужно написать метод службы, который вызывает 3 вышеуказанных метода, применяет некоторые бизнес-проверки, устанавливает возвращаемые значения для экземпляра
UserAppSessionDto
и вернуть
Uni<UserAppSessionDto>
. Я упомянул базовую бизнес-логику (нулевую проверку), которая будет применяться ниже.
public Uni<UserAppSessionDto> getUserAppSessionDetails(Integer orgUserId)
{
UserAppSessionDto user=new UserAppSessionDto();
//1. call the method Uni<UserDto> getUserByOrgUserId(Integer orgUserId)
//2. If UserDto (in the returned Uni) is not null, call Multi<AppDto> getUserApps(Integer orgUserId) and Multi<RoleDto> getUserRoles(Integer orgUserId) methods in parallel.
//3. Set the return values from the above three methods into user variable
//4. Return Uni<UserAppSessionDto>
return Uni.createFrom().item(user);
}
1 ответ
Любая причина, почему
getUserApps
а также
getUserRoles
возвращаются мульти? Я не верю, что они будут передавать результаты, а вместо этого вернут список одним пакетом. Если это так, используя
Uni<List<X>
это лучше.
С этим изменением ваша логика становится намного проще:
public Uni<UserAppSessionDto> getUserAppSessionDetails(Integer orgUserId) {
UserAppSessionDto user=new UserAppSessionDto();
Uni<UserDto> uni = getUserByOrgUserId(orgUserId)
.invoke(userDTO -> user.user = userDTO);
return uni
onItem().ifNotNull().transformToUni(userdto ->
Uni.combine().all()
.unis(getUserApps(orgUserId),getUserRoles(orgUserId))
.asTuple()
.invoke((apps, roles) -> user....)
)
.map(x -> user);
}