扩展反应性 crud 存储库



尝试扩展 Spring 引导ReactiveCrudRepository接口,以便使用单独的方法来插入和更新实体。现在save()是否提供了区分插入和更新检查ID的方法。为什么我需要以这种方式扩展它的想法,因为即将到来的具有新实体或修改实体的 kafka 事件已经填充了 ID。

CustomReactiveCrudRepository:

public interface CustomReactiveCrudRepository<T, ID> extends ReactiveCrudRepository<T, ID> {
<S extends T> Mono<S> insert(S entity);
<S extends T> Mono<S> update(S entity);
}

CustomReactiveCrudRepositoryImpl:

public class CustomReactiveCrudRepositoryImpl<T, ID> extends SimpleR2dbcRepository<T, ID> implements CustomReactiveCrudRepository<T, ID> {
private final RelationalEntityInformation<T, ID> entity;
private final DatabaseClient                     databaseClient;
public CustomReactiveCrudRepositoryImpl(RelationalEntityInformation<T, ID> entity, DatabaseClient databaseClient, R2dbcConverter converter, ReactiveDataAccessStrategy accessStrategy) {
super(entity, databaseClient, converter, accessStrategy);
this.entity = entity;
this.databaseClient = databaseClient;
}
@Override
public <S extends T> Mono<S> insert(S objectToSave) {
Assert.notNull(objectToSave, "Object to save must not be null!");
return this.databaseClient.insert()
.into(this.entity.getJavaType())
.table(this.entity.getTableName()).using(objectToSave)
// Removed ID generation since it's generated initially
.map((row, rowMetadata) -> objectToSave)
.first()
.defaultIfEmpty(objectToSave);
}
@Override
public <S extends T> Mono<S> update(S objectToSave) {
Assert.notNull(objectToSave, "Object to save must not be null!");
return this.databaseClient.update()
.table(this.entity.getJavaType())
.table(this.entity.getTableName()).using(objectToSave)
.fetch().rowsUpdated().handle((rowsUpdated, sink) -> {
if (rowsUpdated == 0) {
sink.error(new TransientDataAccessResourceException(
String.format("Failed to update table [%s]. Row with Id [%s] does not exist.",
this.entity.getTableName(), this.entity.getId(objectToSave))));
} else {
sink.next(objectToSave);
}
});
}
}

FooRepository:

@Repository
public interface FooRepository extends CustomReactiveCrudRepository<Foo, UUID> {}

Foo 实体:

@Data
@Table
public class Foo {
@Id
private UUID      id;
private SomeStatus someStatus;
private Boolean   someBoolean;
}

上面的示例导致不支持的操作异常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fooRepository': Invocation of init method failed; nested exception is java.lang.UnsupportedOperationException: Query derivation not yet supported!

我应该如何以正确的方式扩展这些功能?

它可能不再相关,但这是我是如何做到的(使用 Spring webflux(:

我正在使用R2dbc,它为每个存储库创建一个SimpleR2dbcRepository

我创建了一个自定义类,它扩展了名为CustomRepositorySimpleR2dbcRepository。在配置中,我说@EnableR2dbcRepositories(repositoryBaseClass = CustomRepository.class)

然后我可以覆盖旧方法并创建新方法。

请确保导入org.springframework.data.r2dbc.repository.query.Queryorg.springframework.data.jpa.repository.Query

最新更新