gpt4 book ai didi

java - 如何在 Spring Boot 2.2.x 中使用 Mongo 审计和 UUID 作为 id?

转载 作者:行者123 更新时间:2023-12-01 14:27:57 25 4
gpt4 key购买 nike

我希望使用 UUID id 和 createdAt/updatedAt 字段存储文档。我的解决方案是使用 Spring Boot 2.1.x。从 Spring Boot 2.1.11.RELEASE 升级到 2.2.0.RELEASE 后,我对 MongoAuditing 的测试失败了 createdAt = null .我需要做什么才能再次填充 createdAt 字段?

这不仅仅是一个测试问题。我运行了该应用程序,它的行为与我的测试相同。所有审计字段保持为空。

我有一个配置来启用 MongoAuditing 和 UUID 生成:

@Configuration
@EnableMongoAuditing
public class MongoConfiguration {
@Bean
public GenerateUUIDListener generateUUIDListener() {
return new GenerateUUIDListener();
}
}

监听器 Hook 到 onBeforeConvert - 我想这就是麻烦开始的地方。
public class GenerateUUIDListener extends AbstractMongoEventListener<IdentifiableEntity> {
@Override
public void onBeforeConvert(BeforeConvertEvent<IdentifiableEntity> event) {
IdentifiableEntity entity = event.getSource();
if (entity.isNew()) {
entity.setId(UUID.randomUUID());
}
}
}

文档本身(我删除了 getter 和 setter):
@Document
public class MyDocument extends InsertableEntity {
private String name;
}


public abstract class InsertableEntity extends IdentifiableEntity {
@CreatedDate
@JsonIgnore
private Instant createdAt;
}

public abstract class IdentifiableEntity implements Persistable<UUID> {
@Id
private UUID id;

@JsonIgnore
public boolean isNew() {
return getId() == null;
}
}

可以在此处找到完整的最小示例(包括测试) https://github.com/mab/auditable
2.1.11.RELEASE 测试成功,2.2.0.RELEASE 失败。

最佳答案

对我来说,最好的解决方案是从事件 UUID 生成切换到基于回调的生成。随着Ordered的实现我们可以设置在 AuditingEntityCallback 之后执行的新回调.

public class IdEntityCallback implements BeforeConvertCallback<IdentifiableEntity>, Ordered {
@Override
public IdentifiableEntity onBeforeConvert(IdentifiableEntity entity, String collection) {
if (entity.isNew()) {
entity.setId(UUID.randomUUID());
}
return entity;
}

@Override
public int getOrder() {
return 101;
}
}

我用 MongoConfiguration 注册了回调.对于更通用的解决方案,您可能需要查看 AuditingEntityCallback 的注册信息。使用`MongoAuditingBeanDefinitionParser。
@Configuration
@EnableMongoAuditing
public class MongoConfiguration {
@Bean
public IdEntityCallback registerCallback() {
return new IdEntityCallback();
}
}

关于java - 如何在 Spring Boot 2.2.x 中使用 Mongo 审计和 UUID 作为 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59667676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com