当前位置: 首页 > 知识库问答 >
问题:

叛变反应-如果上游不为空,则持续到数据库

孟增
2023-03-14

我正在开发一个Quarkus MongoDB反应兵变应用程序。我有一个人对象和事件对象。我正在为一个人创建新活动。我的uri看起来像这样

POST/person/{personId}/event

这是完整的代码。

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;


    }

共有1个答案

陈寒
2023-03-14

如果取消,您可以使用兵变:

    @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();
    }

您看到的错误是因为当项不为空时,您返回的是Uni

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。

 类似资料:
  • 问题内容: 我正在使用Hibernate和JPA。我有一个实体,它引用了: 但是在我的数据库中,有些客户没有父母,因此将设置为。我在测试班级时遇到的异常是: 有没有一种方法来设置,以当id为? 问题答案: 尝试这个

  • 问题内容: 我有一个组件。 如果组件没有,我想将prop设置为,否则in可以是可选的。我怎么做? 不需要道具: 需要道具: 如果和为空,则抛出错误,说是 propTypes: 谢谢 问题答案: 您不需要其他库,“ prop- types”提供了现成的功能。参见https://facebook.github.io/react/docs/typechecking-with- proptypes.htm

  • 我试图在同一个事务中执行3个插入,但当其中一个插入失败时,我无法回滚事务。 我是反应式世界的新手,这是我的第一个反应式应用。 下面是数据库模型的简化: 我想在同一事务中执行以下插入: 但是,当第二次插入失败时,第一次插入不会回滚。 我有以下课程: :接收来自Kafka的消息,并通过服务触发插入 :使用3个DAO运行3个插入 :运行实体A的插入 :运行实体B的插入 :运行实体C的插入 和类似于。 我

  • 我试着通过邮寄的方式发送文件。在此之前,我使用http连接,一切正常。但是现在我的PHP文件中的返回一个空数组。 这是我的卷曲日志:

  • 如果值为空,则需要在单元格中显示一个不间断的空格。这是我的模板: 我试过这个,但不管用: 它返回值的问题是: 如果许可证号带有值,则单元格为空,行颜色如下所示。 利用卢库马的建议,它表明了这一点: 更改筛选器中的if语句后,仍然不显示非值:

  • 我正在使用MathJax在浏览器中呈现mathml标记。我使用TeX-AMS-MML_SVG配置在Chrome上运行良好,但在IE8中不起作用。 如果我切换到TeX-AMS-MML_HTMLorMML,它在所有浏览器中都能正常工作。不过,SVG渲染看起来要好得多,所以在可能的情况下,我希望这是首选。 MathJax是否内置了支持这一点的功能?它似乎可以从MML回退到HTML,但不能从SVG回退到H