【问题标题】:Log Spring webflux types - Mono and FluxLog Spring webflux 类型 - Mono 和 Flux
【发布时间】:2019-05-18 18:50:56
【问题描述】:

我是 spring 5 的新手。

1) 如何在不阻塞的情况下记录 Mono 和 Flux 类型的方法参数?

2) 如何使用 Map-struct 将 API 层的模型映射到服务层的业务对象?

编辑 1: 我有这个命令式代码,我正在尝试将其转换为反应式代码。由于在参数中引入了 Mono,目前存在编译问题。

    public Mono<UserContactsBO> getUserContacts(Mono<LoginBO> loginBOMono)
    {

     LOGGER.info("Get contact info for login: {}, and client: {}", loginId, clientId);

    if (StringUtils.isAllEmpty(loginId, clientId)) {
      LOGGER.error(ErrorCodes.LOGIN_ID_CLIENT_ID_NULL.getDescription());
      throw new ServiceValidationException(
          ErrorCodes.LOGIN_ID_CLIENT_ID_NULL.getErrorCode(),
          ErrorCodes.LOGIN_ID_CLIENT_ID_NULL.getDescription());
    }

    if (!loginId.equals(clientId)) {

      if (authorizationFeignClient.validateManagerClientAccess(new LoginDTO(loginId, clientId))) {
        loginId = clientId;
      } else {
        LOGGER.error(ErrorCodes.LOGIN_ID_VALIDATION_ERROR.getDescription());

        throw new AuthorizationException(
            ErrorCodes.LOGIN_ID_VALIDATION_ERROR.getErrorCode(),
            ErrorCodes.LOGIN_ID_VALIDATION_ERROR.getDescription());
      }
    }

    UserContactDetailEntity userContactDetail = userContactRepository.findByLoginId(loginId);
    LOGGER.debug("contact info returned from DB{}", userContactDetail);
    //mapstruct to map entity to BO
    return contactMapper.userEntityToUserContactBo(userContactDetail);
  }

【问题讨论】:

标签: spring logging reactive-programming spring-webflux project-reactor


【解决方案1】:

你可以这样试试。 如果你想添加日志,你可以使用 .map 并在那里添加日志。如果未通过过滤器,它将返回空,您可以使用 swichifempty 获取它

loginBOMono.filter(loginBO -> !StringUtils.isAllEmpty(loginId, clientId))
          .filter(loginBOMono1 -> loginBOMono.loginId.equals(clientId))
          .filter(loginBOMono1 -> authorizationFeignClient.validateManagerClientAccess(new LoginDTO(loginId, clientId)))
          .map(loginBOMono1 -> {
              loginBOMono1.loginId = clientId;
              return loginBOMono1;
          })
          .flatMap(o -> {
             return userContactRepository.findByLoginId(o.loginId);
          })

【讨论】:

  • 谢谢。我达到了一定程度。你能检查一下这个stackoverflow.com/questions/53852733/…
  • 我使用 loginBOMono.log("", Level.INFO, true) 但它没有记录任何内容。
  • 如果您在此链接中谈论反应式编程,stackoverflow.com/questions/53852733/… 并不是反应式编程的最佳示例。如果你想记录你可以使用 .map 并使用 Spring boot Log 如果你想异步你可以使用 EmmiterProcessor 创建一个 util 如果你想要简单的日志你可以使用 reactor .log() 操作符
  • 我对响应式编程很陌生。请您纠正我在stackoverflow.com/questions/53852733/…中的错误
  • 我没有完全理解你的代码,我认为最好使用带有错误代码的 ResponseEntity 而不是抛出错误
猜你喜欢
  • 2018-12-12
  • 2021-09-30
  • 2019-01-20
  • 2018-06-17
  • 2019-03-26
  • 2020-01-22
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多