代码之家  ›  专栏  ›  技术社区  ›  ovnia

在Spring-Webflux控制器中如何结合通量和响应性

  •  4
  • ovnia  · 技术社区  · 7 年前

    我用 Mono s与 ResponseEntity

    @GetMapping("/{userId}")
    fun getOneUser(@PathVariable userId: UserId): Mono<ResponseEntity<UserDto>> {
        return repository.findById(userId)
            .map(User::asDto)
            .map { ResponseEntity.ok(it) }
            .defaultIfEmpty(ResponseEntity.notFound().build())
    }
    
    @GetMapping
    fun getAllUsers(): Flux<UserDto> {
        return repository.findAllActive().map(User::asDto)
    }
    

    结合 Flux ResponseEntity<Flux<T>> ?

    例如:

    @GetMapping("/{userId}/options")
    fun getAllUserOptions(@PathVariable userId: UserId): ??? {
        return repository.findById(userId)
            .flatMapIterable{ it.options }
            .map { OptionDto.from(it) }
            // if findById -> empty Mono then:
            //   return ResponseEntity.notFound().build() ?
            // else:
            //   return the result of `.map { OptionDto.from(it) }` ?
    }
    

    404 如果 repository.findById(userId) 是空的 user.options 作为 通量 .

    这里是存储库 ReactiveCrudRepository

    2 回复  |  直到 7 年前
        1
  •  3
  •   jannis Anjali    7 年前

    switchIfEmpty 要在用户不存在的情况下引发异常:

    return repository
        .findById(userId)
        .switchIfEmpty(Mono.error(NotFoundException("User not found")))
        .flatMapIterable{ it.options }
        .map { OptionDto.from(it) }
    

    然后用一个 exception handler

        2
  •  2
  •   Armen Arzumanyan    7 年前

    您可以通过返回带有ResponseEntity的Mono来使用

    这样地

    public Mono<ResponseEntity<?>> oneRawImage(
            @PathVariable String filename) {
            // tag::try-catch[]
            return imageService.findOneImage(filename)
                .map(resource -> {
                    try {
                        return ResponseEntity.ok()
                            .contentLength(resource.contentLength())
                            .body(new InputStreamResource(
                                resource.getInputStream()));
                    } catch (IOException e) {
                        return ResponseEntity.badRequest()
                            .body("Couldn't find " + filename +
                                " => " + e.getMessage());
                    }
                });         
        }
    

    我也有这样的例子

      public ResponseEntity<Mono<?>>  newLive(@Valid @RequestBody Life life) {
            Mono<Life> savedLive = liveRepository.save(life);
            if (savedLive != null) {
                return new ResponseEntity<>(savedLive, HttpStatus.CREATED);
            }
            return new ResponseEntity<>(Mono.just(new Life()), HttpStatus.I_AM_A_TEAPOT);
        }
    

    我不喜欢REST控制器中的函数式编程。

    ReactiveController .

        3
  •  -1
  •   andreshincapier    6 年前

    为我工作,如果你有麻烦请告诉我

    @PostMapping(value = "/bizagi/sendmsg")
    public Mono<ResponseEntity<?>> sendMessageToQueue(@RequestBody BizagiPost bizagiPost) {
        Mono<BodyReturn> retorno = useCase.saveMsg(bizagiPost);
        Map<String, Object> response = new HashMap<>();
        return retorno.map(t ->
        {
            if (t.getStatusCode().equals("200")) {
                response.put("message", t.getReazon());
                return new ResponseEntity(t, HttpStatus.OK);
            } else {
                response.put("message", t.getReazon());
                return new ResponseEntity(t, HttpStatus.BAD_REQUEST);
            }
        });
    }