我在请求体中传递了一个List,我需要返回一个Mono作为输出响应。但是当在单次更新后使用flatMap时,return语句工作,并在IDE上抛出错误。有什么方法可以实现这一点吗?
ReportController.java
@ApiOperation("This is a POST API for saving active Device details.")
@PostMapping(value = UrlPaths.ACTIVE_DEVICE_WITH_DISCOUNT)
public Mono<UserEventsResponseDTO> activeDeviceWithDiscount(
@Valid @RequestBody List<SelectedEventsForActiveDevicesWithDiscountDTO> userEventsDTOList) {
logger.info("Devices details....{}", userEventsDTOList);
return reportService.saveDeviceDetails(userEventsDTOList);
}
字符串
ReportServiceImpl.java
@Override
public Mono<UserEventsResponseDTO> saveDeviceDetails(
List<SelectedEventsForActiveDevicesWithDiscountDTO> deviceList) {
final UserEventsResponseDTO responseDTO = new UserEventsResponseDTO();
final List<SelectedEventsForActiveDevicesWithDiscount> activeDeviceList = new ArrayList<SelectedEventsForActiveDevicesWithDiscount>();
deviceList.forEach(device -> {
SelectedEventsForActiveDevicesWithDiscount deviceDetails = new SelectedEventsForActiveDevicesWithDiscount();
deviceDetails.setAddedOn(device.getAddedOn());
deviceDetails.setUpdatedOn(device.getUpdatedOn());
deviceDetails.setContractId(device.getContractId());
deviceDetails.setCustomerId(device.getCustomerId());
deviceDetails.setEventName(device.getEventName());
deviceDetails.setIsSubscribed(device.getIsSubscribed());
deviceDetails.setMonthYear(device.getMonthYear());
deviceDetails.setDeviceType(device.getDeviceType());
deviceDetails.setProfileId(device.getProfileId());
deviceDetails.setSourceId(device.getSourceId());
deviceDetails.setDeviceId(device.getDeviceId());
activeDeviceList.add(deviceDetails);
});
logger.info("Device Details...{}", activeDeviceList);
activeDeviceList.forEach(activeDevice -> {
String addedOnDate = activeDevice.getAddedOn().split("T")[0];
logger.info("Added on...{}", addedOnDate);
String updatedOnDate = activeDevice.getUpdatedOn().split("T")[0];
logger.info("Updated on....{}", updatedOnDate);
LocalDate addedOn = LocalDate.parse(addedOnDate);
LocalDate updatedOn = LocalDate.parse(updatedOnDate);
String deviceId = activeDevice.getDeviceId();
logger.info("Device ID...{}", deviceId);
if (!addedOn.isEqual(updatedOn)) {
logger.info("It is a new record...{}");
return activeDevicesRepo.findByDeviceIdAndAddedOn(deviceId, activeDevice.getAddedOn())
.flatMap(deviceDetails2 -> {
logger.info("Device Details...{}", deviceDetails2);
deviceDetails2.setContractId(activeDevice.getContractId());
deviceDetails2.setCustomerId(activeDevice.getCustomerId());
deviceDetails2.setDeviceId(activeDevice.getDeviceId());
deviceDetails2.setDeviceType(activeDevice.getDeviceType());
deviceDetails2.setEventName(activeDevice.getEventName());
deviceDetails2.setIsSubscribed(activeDevice.getIsSubscribed());
deviceDetails2.setMonthYear(activeDevice.getMonthYear());
deviceDetails2.setProfileId(activeDevice.getProfileId());
deviceDetails2.setSourceId(activeDevice.getSourceId());
deviceDetails2.setUpdatedOn(activeDevice.getUpdatedOn());
deviceDetails2.setAddedOn(activeDevice.getAddedOn());
activeDevicesRepo.save(deviceDetails2).subscribe(deviceDetails3 -> {
logger.info("Record updated Successfully...{}", deviceDetails3);
responseDTO.setResponseMessage("Updated Successfully");
responseDTO.setStatusCode(201);
return Mono.just(responseDTO);
});
});
}
});
}
型
1条答案
按热度按时间insrf1ej1#
问题在于在forEach循环中使用flatMap。flatMap操作用于转换值并将其从Mono或Flux中解包。然而,在您当前的代码中,您正在forEach循环中使用flatMap,这不允许您从forEach循环中返回Mono。相反,您正在从内部subscribe块中返回值,这不符合预期。
下面是saveDeviceDetails方法的修改版本,它正确使用Flux和flatMap来处理异步操作并组成最终响应:
字符串