Why my Mono should be subscribed while another case it runs correctly

huangapple 未分类评论44阅读模式
英文:

Why my Mono should be subscribed while another case it runs correctly

问题

在这段代码中,只有当我订阅它时,orderRepository.save(orders) 才能正常工作。但是我已经在我的 RestController 中调用了 subscribe。

@Service
public class CompleteOrderCommandImpl implements CompleteOrderCommand {

    @Autowired
    private OrderRepository orderRepository;

    @Override
    public Mono<Boolean> execute(CancelOrderCommandRequest request) {
        return orderRepository.findById(request.getOrderId())
            .flatMap(this::changeToCancel)
            .map(order -> true);
    }

    private Mono<Orders> changeToCancel(Orders orders) {
        orders.setStatus(StatusEnum.COMPLETED.toString());
        return orderRepository.save(orders);
    }
}

对于另一个类似的情况,restaurantRepository.save(restaurant) 不需要订阅,因为它在 RestController 中调用了 subscribe。

@Service
public class ApprovePendingRestaurantCommandImpl implements ApprovePendingRestaurantCommand {

    @Autowired
    private RestaurantRepository restaurantRepository;

    @Override
    public Mono<RestaurantResponse> execute(ApprovePendingRestaurantCommandRequest request) {
        return restaurantRepository.findById(request.getRestaurantId())
            .flatMap(this::changeRestaurantStatus)
            .map(this::constructResponse);
    }

    private Mono<Restaurant> changeRestaurantStatus(Restaurant restaurant) {
        restaurant.setStatus(true);
        return restaurantRepository.save(restaurant);
    }

    private RestaurantResponse constructResponse(Restaurant restaurant) {
        RestaurantResponse response = new RestaurantResponse();
        BeanUtils.copyProperties(restaurant, response);
        return response;
    }
}

这是我的控制器部分:

@PostMapping("/api/merchant/orders/{orderId}/complete")
public Mono<Response<Boolean>> completeOrder(Authentication authentication, @PathVariable String orderId) {
    return commandExecutor.execute(CompleteOrderCommand.class, constructCancelOrderCommandRequest(authentication, orderId))
            .map(ResponseHelper::ok)
            .subscribeOn(Schedulers.elastic());
}

@PostMapping("/api/admin/restaurant/{restaurantId}")
public Mono<Response<RestaurantResponse>> approvePendingRestaurant(@PathVariable String restaurantId) {
    return commandExecutor.execute(ApprovePendingRestaurantCommandImpl.class, constructApprovePendingRestaurantCommandRequest(restaurantId))
            .map(ResponseHelper::ok)
            .subscribeOn(Schedulers.elastic());
}
英文:

on this code, orderRepository.save(orders) is not working until i subscribe it. But i have called subscribe from my RestController.

@Service
public class CompleteOrderCommandImpl implements CompleteOrderCommand {

    @Autowired
    private OrderRepository orderRepository;

    @Override
    public Mono&lt;Boolean&gt; execute(CancelOrderCommandRequest request) {
        return orderRepository.findById(request.getOrderId())
            .flatMap(this::changeToCancel)
            .map(order -&gt; true);
    }

    private Mono&lt;Orders&gt; changeToCancel(Orders orders) {
        orders.setStatus(StatusEnum.COMPLETED.toString());
        return orderRepository.save(orders);
    }
}

i have no idea why this happens while another case like this. restaurantRepository.save(restaurant) run without subscribe. because it is (subscribe) called in RestController.

@Service
public class ApprovePendingRestaurantCommandImpl implements ApprovePendingRestaurantCommand {

    @Autowired
    private RestaurantRepository restaurantRepository;

    @Override
    public Mono&lt;RestaurantResponse&gt; execute(ApprovePendingRestaurantCommandRequest request) {
        return restaurantRepository.findById(request.getRestaurantId())
            .flatMap(this::changeRestaurantStatus)
            .map(this::constructResponse);
    }

    private Mono&lt;Restaurant&gt; changeRestaurantStatus(Restaurant restaurant) {
        restaurant.setStatus(true);

        return restaurantRepository.save(restaurant);
    }

    private RestaurantResponse constructResponse(Restaurant restaurant) {
        RestaurantResponse response = new RestaurantResponse();
        BeanUtils.copyProperties(restaurant, response);

        return response;
    }
}

this is my controller

@PostMapping(&quot;/api/merchant/orders/{orderId}/complete&quot;)
public Mono&lt;Response&lt;Boolean&gt;&gt; completeOrder(Authentication authentication, @PathVariable String orderId) {
    return commandExecutor.execute(CompleteOrderCommand.class, constructCancelOrderCommandRequest(authentication, orderId))
            .map(ResponseHelper::ok)
            .subscribeOn(Schedulers.elastic());
}

@PostMapping(&quot;/api/admin/restaurant/{restaurantId}&quot;)
public Mono&lt;Response&lt;RestaurantResponse&gt;&gt; approvePendingRestaurant(@PathVariable String restaurantId) {
    return commandExecutor.execute(ApprovePendingRestaurantCommandImpl.class, constructApprovePendingRestaurantCommandRequest(restaurantId))
            .map(ResponseHelper::ok)
            .subscribeOn(Schedulers.elastic());
}

huangapple
  • 本文由 发表于 2020年7月24日 12:53:00
  • 转载请务必保留本文链接:https://java.coder-hub.com/63067058.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定