我构建了一个小的 Rest API 来了解更多关于 Quarkus 框架的信息。现在我想开始使用带有反应式 API 的框架,但我很难理解一些概念。目前,该项目正在使用 RESTEasy Reactive with Jackson,Hibernate Reactive with Panache 和 Postgresql Reactive Client。
这是我的课
@Table(name = "cat_role")
@Entity
public class Role extends PanacheEntityBase {
private static final long serialVersionUID = -2246110460374253942L;
@Id
@Column(name = "id", nullable = false, updatable = false)
@GeneratedValue
public UUID id;
@Enumerated(EnumType.STRING)
@Column(name = "name", nullable = false, length = 18)
public UserRole name;
public enum UserRole {
Administrador, Asesor_Empresarial, Asesor_Academico, Alumno
}
}
现在,在我的服务中(势在必行),我执行以下操作:
角色类
public static Boolean existsRoleSeed(){
return Role.count() > 0;
}
角色服务类
@Transactional
public void seedRoles() {
if (!Role.existsRoleSeed()) {
for(Role.UserRole userRole: Role.UserRole.values()){
Role role = Role.builder()
.name(userRole)
.build();
role.persist();
}
}
}
这显然会在数据库中注册 UserRole 枚举中的所有角色,并且它工作正常。我想要实现的是复制这种方法,但使用反应形式。这些是我在代码中所做的更改
角色类
public static Uni<Boolean> existsRoleSeed() {
return Role.count().map(x -> x > 0);
}
角色服务类
@ReactiveTransactional
public void seedRoles() {
Role.existsRoleSeed()
.map(exists -> {
if (!exists) {
Multi.createFrom()
.iterable(Arrays
.stream(Role.UserRole.values())
.map(userRole -> Role.builder()
.name(userRole)
.build())
.collect(Collectors.toList()))
.map(role -> role.persistAndFlush())
.subscribe().with(item -> LOGGER.info("Something happened"), failure -> LOGGER.info("Something bad happened"));
}
return null;
}).subscribe().with(o -> {
});
}
当我运行应用程序时,它没有给出任何错误,日志显示发生了一些事情,数据库创建了表,但是它没有插入任何东西。我以不同的方式尝试过它,但是,我没有成功地让它像我希望的那样工作。