首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变反应性-如果上游不是空的,则持久化到DB。

改变反应性-如果上游不是空的,则持久化到DB。
EN

Stack Overflow用户
提问于 2022-06-09 03:57:32
回答 1查看 221关注 0票数 0

我正在开发Quarkus + MongoDB Reactive+ Mutiny应用程序。我有一个Person对象和Event对象。我正在为一个人创造一个新的事件。我的uri长得像这样

职位/人员/{personId}/event

我需要首先检查这个人是否存在于MongoDB中。如果此人存在,则保存事件。如果person不存在,则创建错误状态并返回。我什么都试过了,但是我被卡住了,所需的返回类型是Uni,而所需的类型是Uni。我也尝试过使用transformToUni,但是它没有起作用。也尝试了很少其他方式,如onItemOrFailure()等,但似乎没有任何效果。

这是完整密码。

代码语言:javascript
复制
public class EventResource {

    @Inject
    EventRepository eventRepository;

    @Inject
    PersonRepository personRepository;

    @POST
    @Path("/{person_id}/event")
    public Uni<Response> create(Event event, @PathParam("person_id") String personId){
        //Check if personId exist.
        Uni<Person> uniPerson = personRepository.getPersonById(personId);

        //THIS WORKS BUT ON FAILURE IS TREATED WHEN ERROR IS RAISED FOR EeventRepository.craete() and not if person is not found.
         /*return uniPerson.onItem().ifNotNull()
                                    .transformToUni(pid -> eventRepository.create(event, pid.getId()))
                                    .onItem().transform(e -> Response.ok().entity(e).build())

                .onFailure()
                .recoverWithItem(f-> {
                    AStatus status =  createErrorStatus(f.getMessage());
                    return Response.serverError().entity(status).build();
                });
*/
        Uni<Response> eventResp = uniPerson.onItem().transform(person -> {
                                                        if(person==null)
                                                            return Response.serverError().build();
                                                        else{
                                                          return    eventRepository.create(event, person.getId())
                                                                  .onItem().transform(event1 -> Response.ok(event1).build());

                                                        }


                                                    });

        return eventResp;


    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-11 11:45:17

您可以使用兵变ifNull

代码语言:javascript
复制
    @POST
    @Path("/{person_id}/event")
    public Uni<Response> create(Event event, @PathParam("person_id") String personId){
         return personRepository
                 .getPersonById(personId)
                 .onItem().ifNotNull().transformToUni(person -> createEvent(event, person))
                 .onItem().ifNull().continueWith(this::personNotFound)
                 // This onFailure will catch all the errors
                 .onFailure()
                    .recoverWithItem(f-> {
                         AStatus status =  createErrorStatus(f.getMessage());
                         return Response.serverError().entity(status).build();
                    });
    }


    private Uni<Response> createEvent(Event event, Person person) {
        return eventRepository
            .create(event, person.getId())
            .map( e -> Response.ok().entity(e).status(CREATED).build())
    }

    private Response personNotFound() {
        return Response.serverError().build();
    }

您所看到的错误是因为当项不是null时,您将返回一个Uni<Uni<Response>>。这是修复它的一种方法:

代码语言:javascript
复制
Uni<Response> eventResp = uniPerson
    .chain(person -> {
        if (person==null)
            return Uni.createFrom().item(Response.serverError().build());
        else {
            return eventRepository
                .create(event, person.getId())
                .map(event1 -> Response.ok(event1).build());
        }
    });

我使用mapchain是因为它们更短,但是您可以用onItem().transform(...)onItem().transformToUni(...)替换它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72554585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档