如何使用RXJava和Micronaut构建rest-ful API?

如何使用RXJava和Micronaut构建rest-ful API?,rest,rx-java2,micronaut,Rest,Rx Java2,Micronaut,我想编写一个RESTAPI,当我试图创建一个已经存在的实体或更新一个不存在的实体时,它将返回HTTP 400 @Post fun create(@Body entity: @Valid Entity): HttpResponse<Entity> { val optional = entityService.find(entity) if(optional.isPresent) { return HttpResponse.badRequest()

我想编写一个RESTAPI,当我试图创建一个已经存在的实体或更新一个不存在的实体时,它将返回HTTP 400

@Post
fun create(@Body entity: @Valid Entity): HttpResponse<Entity> {
    val optional = entityService.find(entity)
    if(optional.isPresent) {
        return HttpResponse.badRequest()
    }
    return HttpResponse.created(entityService.save(entity))
}
@Post
趣味创建(@Body实体:@Valid实体):HttpResponse{
val optional=entityService.find(实体)
如果(可选。isPresent){
返回HttpResponse.badRequest()
}
返回HttpResponse.created(entityService.save(entity))
}
如何使用RXJava2和Micronaut的非阻塞端点来实现这一点,我只能找到使用switchIfEmpty

@Post
@Status(HttpStatus.CREATED)
fun createMeal(@Body entity: @Valid Entity): Single<Entity> {
    return entityService.find(entity)
            .switchIfEmpty(entityService.save(entity))
            .map{success -> entity}
}
@Post
@状态(HttpStatus.CREATED)
fun CreateMedine(@Body entity:@Valid entity):单个{
返回entityService.find(实体)
.switchIfEmpty(entityService.save(实体))
.map{success->entity}
}
但是这段代码总是返回HTTP200,即使没有保存任何内容,我认为这不是一个好的做法


谢谢

您可以使用
映射
将实体转换为错误的请求响应,因为如果它存在,这就是您想要返回的。您还可以使用switchIfEmpty保存实体,这仅在找不到实体时才会发生。确保将该代码包装在可流动的
中。延迟
以防止逻辑在任何情况下执行。在上面的被动示例中,每次执行时都会进行保存

return entityService.find(entity)
    .map(entity -> HttpResponse.badRequest())
    .switchIfEmpty(Flowable.defer() -> {
        //return a publisher that emits HttpResponse.created(entity)
    })

最后我做了这样的事情:

fun update(name: String, entity: Entity): Single<Entity> {
    val observable = BehaviorSubject.create<Entity>()
    entitysRepository.find(name)
            .subscribe(
                    {
                        entity.name = name
                        update(entity, observable)
                    },
                    { observable.onError(RuntimeException("Entity : $name doesn't exist")) }
            )
    return observable.singleOrError()
}

fun save(entity: Entity): Single<Entity> {
    val observable = BehaviorSubject.create<Entity>()
    entitysRepository.find(entity.name)
            .subscribe(
                    { observable.onError(RuntimeException("Entity : ${entity.name} already exist")) },
                    { save(entity, observable) }
            )
    return observable.singleOrError()
}
fun更新(名称:字符串,实体:实体):单个{
val observable=BehaviorSubject.create()
entitysRepository.find(名称)
.订阅(
{
entity.name=名称
更新(实体,可观察)
},
{observable.onError(运行时异常(“实体:$name不存在”)}
)
返回可观察的。singleOrError()
}
乐趣保存(实体:实体):单个{
val observable=BehaviorSubject.create()
entitysRepository.find(entity.name)
.订阅(
{observable.onError(运行时异常(“实体:${Entity.name}已存在”)},
{保存(实体,可观察)}
)
返回可观察的。singleOrError()
}

我真的不知道这是否是一个好的实践。

我稍后会测试您的解决方案,这次我很紧张。谢谢,我找到了更新的方法:
entityRepository.find(name).flatMapSingleElement{entityRepository.update(entity)}.switchIfEmpty(Single.error{RuntimeException(“Entityl$name不存在”)}
,但没有保存的线索