Log Spring webflux 类型 - Mono 和 Flux

Posted

技术标签:

【中文标题】Log Spring webflux 类型 - Mono 和 Flux【英文标题】:Log Spring webflux types - Mono and 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);
  

【问题讨论】:

您能否详细说明一下代码示例的问题?请参阅***.com/help/mcve 以获得一些帮助。 添加了代码。 【参考方案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);
          )

【讨论】:

谢谢。我达到了一定程度。你能检查一下这个***.com/questions/53852733/… 我使用 loginBOMono.log("", Level.INFO, true) 但它没有记录任何内容。 如果您在此链接中谈论反应式编程,***.com/questions/53852733/… 并不是反应式编程的最佳示例。如果你想记录你可以使用 .map 并使用 Spring boot Log 如果你想异步你可以使用 EmmiterProcessor 创建一个 util 如果你想要简单的日志你可以使用 reactor .log() 操作符 我对响应式编程很陌生。请您纠正我在***.com/questions/53852733/…中的错误 我没有完全理解你的代码,我认为最好使用带有错误代码的 ResponseEntity 而不是抛出错误

以上是关于Log Spring webflux 类型 - Mono 和 Flux的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux Webclient |内容类型标题设置问题

WebFlux系列WebClient 日志

如何在spring webflux安全中通过绕过选项请求?

如何绕过spring webflux security中的一些url?

WebFlux系列 Server-Sent Events

Spring WebFlux - bodyType=org.springframework.web.multipart.MultipartFile 不支持内容类型“application/xml”