当前位置: 首页 > 知识库问答 >
问题:

如何将方法从命令式更改为反应式

袁奇玮
2023-03-14

我构建了一个小型Rest API,以了解更多关于Quarkus框架的信息。现在我想开始使用带有反应式API的框架,但我很难理解一些概念。目前,该项目正在使用RESTEasy Responsive与Jackson、Hibernate Responsive与Panache以及Postgresql Responsive客户端。

这是我的课

@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 -> {
                });
    }

当我运行应用程序时,它没有给出任何错误,日志显示发生了什么,数据库创建了表,但是它没有插入任何内容。我尝试过不同的方法,但是,我没有成功地使它像我希望的那样工作。

共有1个答案

袁鸿雪
2023-03-14

根据@Haroon的回答和@Clement的评论,我做了以下工作

  • 删除了@ReactiveTransactional,因为我的方法返回空并且不在REST边界上
  • 当我删除注释时,我需要使用Panache.with事务方法
  • 最后在方法中我订阅了多

需要注意的是,我将TransformTounianedMerge从@Haroon答案更改为transformToUniAndConcatenate,以维护角色的顺序。

public void seedRoles() {
        Role.existsRoleSeed()
                .onItem().transformToMulti(exists -> {
                    if (!exists) {
                        return Multi.createFrom().items(Role.UserRole.values());
                    } else {
                        return Multi.createFrom().nothing();
                    }
                })
                .map(userRole -> Role.builder().name(userRole).build())
                .onItem().transformToUniAndConcatenate(role -> Panache.withTransaction(role::persist))
                .subscribe().with(subscription -> LOGGER.infov("Persisting: {0}", subscription));
    }
 类似资料:
  • 文件夹结构是正确的--也就是说,我有一个与node_modules/karma/bin匹配的嵌套文件夹结构,并且我在那个位置有一个名为karma的文件。 我在两个例子中都是从同一个位置开始的。在Visual Studio代码终端或windows命令提示符中运行此命令时,会出现以下错误:“'node_modules'未被识别为内部或外部命令、可操作程序或批处理文件。” 但在GitBash,它工作得很

  • 问题内容: 我想从命令行的查询输出到MySQL获得无标题的CSV数据。我在与MySQL服务器不同的计算机上运行此查询,因此所有带有“ INTO OUTFILE”的Google回答都不好。 所以我跑了。输出的内容看起来像这样: 好吧,那不好。但是,嘿,看!如果我仅将其通过管道传递到 任何内容 ,它将变成制表符分隔的列表: 那样更好-至少可以通过程序分析。但是我不想要TSV,我想要CSV,也不需要那个

  • 问题内容: 我正在使用ngbDatepicker,这给了我JSON日期格式,例如: 如何将其转换为YYYY / MM / DD?我正在使用Angular 7。 我的代码如下: 问题答案: 有两个重要的类来管理ngbDate。一个用于格式化日期:DateParserFormater,另一个用于更改从ngb- datepicker获取/发送的值:DateAdapter。 因此,您可以创建一个custo

  • 我正在尝试使用OWIN外部登录到Google/Facebook。 面临的问题是owin挑战不断将响应类型从令牌更改为代码。 挑战生成以下URL:https://accounts.google.com/o/oauth2/auth?response_type=code 这将返回来自google的错误。如果我改变response_type令牌(response_type=令牌)它的工作。 下面是OAut

  • 问题内容: 输出将是: 看起来,当更改为时,分数将被丢弃。 问题答案: 这里的问题是常量和浮点数的表示形式。 常数以任意精度表示。浮点数使用IEEE 754 标准表示。 规格:常数: 数字常数表示任意精度的值,并且不会溢出。 规格:数值类型: 在IEEE 754中,使用64位(在Go中)的 53位 双精度用于存储数字。这意味着可以表示的最大位数(最大位数)是其中的位数(1位表示符号): 精确到15

  • 我试图找到一种方法,可以将WinAnsiEncoding更改为Unicode,我试着像这样设置字体, 对于简单的文本,这很好,我可以看到Helvetica的字体变化,但是如果文本包含UTF-8字符(例如,U+0083等),我只会看到抛出以下异常, java.lang.IllegalArgumentException:U+0083在此字体的编码中不可用:WinAnsiEncoding org.apa