英文:
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语言的经验与见解,让所有开发者获益!
评论