Spring Data Jpa SpringBoot WebFlux更新Object数据列表并返回Mono

anhgbhbe  于 11个月前  发布在  Spring
关注(0)|答案(1)|浏览(92)

我在请求体中传递了一个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);
                            });
                            
                        });
            }
        });
    }

insrf1ej

insrf1ej1#

问题在于在forEach循环中使用flatMap。flatMap操作用于转换值并将其从Mono或Flux中解包。然而,在您当前的代码中,您正在forEach循环中使用flatMap,这不允许您从forEach循环中返回Mono。相反,您正在从内部subscribe块中返回值,这不符合预期。
下面是saveDeviceDetails方法的修改版本,它正确使用Flux和flatMap来处理异步操作并组成最终响应:

@Override
public Mono<UserEventsResponseDTO> saveDeviceDetails(List<SelectedEventsForActiveDevicesWithDiscountDTO> deviceList) {
// ... (previous code)

// Process the list of device details using Flux
return Flux.fromIterable(activeDeviceList)
        .flatMap(activeDevice -> {
            String addedOnDate = activeDevice.getAddedOn().split("T")[0];
            String updatedOnDate = activeDevice.getUpdatedOn().split("T")[0];
            LocalDate addedOn = LocalDate.parse(addedOnDate);
            LocalDate updatedOn = LocalDate.parse(updatedOnDate);
            String deviceId = activeDevice.getDeviceId();

            if (!addedOn.isEqual(updatedOn)) {
                return activeDevicesRepo.findByDeviceIdAndAddedOn(deviceId, activeDevice.getAddedOn())
                        .flatMap(deviceDetails2 -> {
                            // Update device details and save
                            deviceDetails2.setContractId(activeDevice.getContractId());
                            deviceDetails2.setCustomerId(activeDevice.getCustomerId());
                            // ... (set other properties)
                            
                            return activeDevicesRepo.save(deviceDetails2)
                                    .map(savedDeviceDetails -> {
                                        responseDTO.setResponseMessage("Updated Successfully");
                                        responseDTO.setStatusCode(201);
                                        return responseDTO;
                                    });
                        });
            } else {
                // Handle the case where addedOn is equal to updatedOn
                // (You might want to return an appropriate response here)
                return Mono.empty();
            }
        })
        .last()  // Collect the last emitted value (responseDTO) from the Flux
        .switchIfEmpty(Mono.defer(() -> {
            responseDTO.setResponseMessage("No records updated");
            responseDTO.setStatusCode(200);
            return Mono.just(responseDTO);
        }));
}

字符串

相关问题