首页 > 解决方案 > Spring Data R2dbc 审计无法按预期工作

问题描述

我的示例代码基于 Spring Boot 2.4.0-M2(spring-data-r2dbc 1.2.0-M2)、Java 11、Postgres。

在 Spring 博客和更改日志中,它声明 Spring Data R2dbc 获得了审计支持。

我启用了这样的审核。

@Configuration
@EnableR2dbcAuditing
class DataConfig {

    @Bean
    ReactiveAuditorAware<String> auditorAware() {
        return () -> Mono.just("hantsy");
    }
}

以及实体类和存储库。

interface PersonRepository extends R2dbcRepository<Person, UUID> {
}

@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "persons")
class Person {

    @Id
    @Column("id")
    private UUID id;

    @Column("first_name")
    private String firstName;

    @Column("last_name")
    private String lastName;

    @Column("created_at")
    @CreatedDate
    private LocalDateTime createdAt;

    @Column("updated_at")
    @LastModifiedDate
    private LocalDateTime updatedAt;

    @Column("version")
    @Version
    private Long version;

}

架构脚本。(不用担心 UUID,在 docker init 脚本中初始化的扩展)

 CREATE TABLE IF NOT EXISTS persons (
 -- id SERIAL PRIMARY KEY,
  id UUID DEFAULT uuid_generate_v4(),
  first_name VARCHAR(255),
  last_name VARCHAR(255),
  created_at TIMESTAMP ,
  updated_at TIMESTAMP,
  version INTEGER,
  PRIMARY KEY (id)
  );

当我在中添加以下代码片段ApplicationRunner来体验审计时,没有一个@createdDate@lastModifiedDate被填充。

            persons
                    .save(
                            Person.builder()
                                    .firstName("hantsy")
                                    .lastName("bai")
                                    .build()
                    )
                    .log()
                    .map(person -> {
                        person.setFirstName("new Hantsy");
                        return person;
                    })
                    .flatMap(persons::save)
                    .log()
                    .then()
                    .thenMany(persons.findAll())
                    .subscribe(
                            data -> log.info("saved data: {}", data),
                            err -> log.error("err: {}", err)
                    );

控制台打印:

2020-09-07 22:12:30.734  INFO 8800 --- [actor-tcp-nio-2] reactor.Mono.UsingWhen.1                 : onNext(Person(id=8814e87c-c6d3-4dca-a095-fb5f41696b49, firstName=hantsy, lastName=bai, createdAt=null, updatedAt=null, version=0))
2020-09-07 22:12:30.779  INFO 8800 --- [actor-tcp-nio-2] reactor.Mono.UsingWhen.1                 : onComplete()
2020-09-07 22:12:30.801  INFO 8800 --- [actor-tcp-nio-2] reactor.Mono.FlatMap.2                   : | onNext(Person(id=8814e87c-c6d3-4dca-a095-fb5f41696b49, firstName=new Hantsy, lastName=bai, createdAt=null, updatedAt=null, version=1))
2020-09-07 22:12:30.801  INFO 8800 --- [actor-tcp-nio-2] reactor.Mono.FlatMap.2                   : | onComplete()
2020-09-07 22:12:30.823  INFO 8800 --- [actor-tcp-nio-2] com.example.demo.DemoApplication         : saved data: Person(id=981741c3-4468-474d-9e92-b4d396f004d9, firstName=hantsy, lastName=bai, createdAt=null, updatedAt=null, version=0)
2020-09-07 22:12:30.824  INFO 8800 --- [actor-tcp-nio-2] com.example.demo.DemoApplication         : saved data: Person(id=8814e87c-c6d3-4dca-a095-fb5f41696b49, firstName=new Hantsy, lastName=bai, createdAt=null, updatedAt=null, version=1)

更新:为 r2dbc 审计创建了另一个简单的示例(基于 H2)以重现它,测试代码有效,但应用程序仍然存在问题。不确定我的原始示例(基于 Postgres,并使用 Pg 特定的 JSON、Enum 等)是否需要其他配置,应用程序和测试代码都没有按预期工作。

更新:在 Github 问题中报告了一个相关问题,请参阅问题#451。更新了我的示例以确保在 1.2.0 snapshot20200910 版本中应用了修复。我认为下一个版本(1.2.0-RC1)将包括修复。

更新:我的示例更新到 Spring Boot 2.4.0-M3,错误已修复。

标签: postgresqlspring-bootspring-dataspring-webfluxspring-data-r2dbc

解决方案


推荐阅读