我正在开发Quarkus + MongoDB Reactive+ Mutiny应用程序。我有一个Person对象和Event对象。我正在为一个人创造一个新的事件。我的uri长得像这样
职位/人员/{personId}/event
我需要首先检查这个人是否存在于MongoDB中。如果此人存在,则保存事件。如果person不存在,则创建错误状态并返回。我什么都试过了,但是我被卡住了,所需的返回类型是Uni,而所需的类型是Uni。我也尝试过使用transformToUni,但是它没有起作用。也尝试了很少其他方式,如onItemOrFailure()等,但似乎没有任何效果。

这是完整密码。
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;
}发布于 2022-06-11 11:45:17
您可以使用兵变ifNull
@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>>。这是修复它的一种方法:
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());
}
});我使用map和chain是因为它们更短,但是您可以用onItem().transform(...)和onItem().transformToUni(...)替换它们。
https://stackoverflow.com/questions/72554585
复制相似问题