Java 8 Необязательный внутри Необязательный - PullRequest
0 голосов
/ 17 мая 2018

Я использую Optional для управления транзакциями следующим образом

    EmployeeBo transactionResult =
    Optional.ofNullable(service.save(employeeBo))
        .filter(o -> o.getId() !=null && o.getId() > 0)
        .map(employeeBo1 -> {
          Boolean resultFileController =
              Optional.ofNullable(fileController.increaseUsedById(Authorization, fileIds))
                  .filter(o1 -> o1.getStatusCode().equals(HttpStatus.OK))
                  .map(fileResponse -> {
                    ResponseEntity<ObjectResponseBo> userResponse = null;
                    try {
                      userResponse = userService.addUser(Authorization, populateUser(employeeBo.getId()));
                    } catch (Exception e) {
                      e.printStackTrace();
                    }
                    Boolean resultUserService = Optional.ofNullable(userResponse)
                        .filter(o2 -> o2.getStatusCode().equals(HttpStatus.CREATED))
                        .map(o3 -> {
                          logger.debug(()-> "User Added successfully !! ");
                          return true;
                        }).orElseGet(() -> {
                          logger.debug(()->"User Not Added successfully !! ");
                          return false;
                        });
                    //Rollback File
                    if (resultUserService == Boolean.FALSE) {
                      fileController.decreaseUsedById(Authorization, fileIds);
                      logger.debug(()->"File Rollbacked !! ");
                      return false;
                    }
                    logger.debug(()->"File Update successfully !! ");
                    return true;
                  }).orElseGet(() -> {
                    logger.debug(()->"File record updation failed !! ");
                    return false;
                  });
          //Rollback Employee
          if (resultFileController == Boolean.FALSE) {
            service.delete(employeeBo1.getId());
            logger.debug(()->"Rollback Company successfully !! ");
            return employeeBo;
          }
          logger.debug(()->"Company Saved successfully !! ");
          return employeeBo1;
        }).orElseGet(() -> {
        logger.debug(()->"Company Saved failed !! ");
        return null;
        });

работает нормально. но код не легко читается как необязательный внутренний параметр и т. д. Как еще можно добиться такой цепочки отката? как если бы какая-либо транзакция потерпела неудачу, это интимная предыдущая транзакция, которую я провалил и т. д.

любое другое хорошее решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...