英文:
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<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);
    }
}
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<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;
    }
}
this is my controller
@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());
}
专注分享java语言的经验与见解,让所有开发者获益!



评论