Я не знаю, что еще добавить в предложение else в этих позициях

#java #spring #spring-boot #spring-mvc #spring-data-jpa

#java #весна #spring-boot #spring-mvc #spring-data-jpa

Вопрос:

что я могу написать в операторах else без ошибок или исключений в этом методе
этот код написан на java и используется mongo db я хочу добавить объект из WorkOrder и проверить, является ли значение null или нет, и я хочу проверить, является ли идентификатор null или нет, но если WorkOrder или id равно null, я не знаю, что я могу вернуть

     public TaskDataDTO save(TaskDataDTO taskDataDTO,String WorkOrderId) {
            if(WorkOrderId!=null) {
                taskDataDTO.setWorkOrderId(WorkOrderId);
                Optional<WorkOrderDTO> workOrderDTO=workOrderRepository.findById(WorkOrderId).map(workOrderMapper::toDto);
                if(workOrderDTO!=null)
                {
                    log.debug("Request to save TaskData : {}", taskDataDTO);
                    taskDataDTO.setWorkOrderDTO(workOrderDTO);
                    TaskData taskData = taskDataMapper.toEntity(taskDataDTO);
                    taskData = taskDataRepository.save(taskData);
                    return taskDataMapper.toDto(taskData);
                }
                else {
                    //what can i write here
                    
                }
                

            }
            else{
                //what can i write here
            }

}
 

Комментарии:

1. Либо оберните это в Optional или сгенерируйте исключение, если вы ожидаете запись в базе данных. Другой вариант — вернуть null , но это не рекомендуется

2. кстати, я был бы ОЧЕНЬ удивлен, если workOrderDTO когда-либо null , его может не быть, но необязательное значение null само по себе было бы очень, очень плохим стилем.

3. тогда каковы наилучшие методы в этом случае

Ответ №1:

Вам нужно будет иметь дело с исключениями при вызове метода, но это будет безопаснее в вашем случае:

 public TaskDataDTO save(TaskDataDTO taskDataDTO,String WorkOrderId) throws Exception {
        if(WorkOrderId!=null) {
            taskDataDTO.setWorkOrderId(WorkOrderId);
            Optional<WorkOrderDTO> workOrderDTO=workOrderRepository.findById(WorkOrderId).map(workOrderMapper::toDto);
            if(workOrderDTO!=null)
            {
                log.debug("Request to save TaskData : {}", taskDataDTO);
                taskDataDTO.setWorkOrderDTO(workOrderDTO);
                TaskData taskData = taskDataMapper.toEntity(taskDataDTO);
                taskData = taskDataRepository.save(taskData);
                return taskDataMapper.toDto(taskData);
            }
            else {
                throw new java.util.NoSuchElementException("The work order was not found");
            }
            

        }
        else{
           throw new IllegalArgumentException("WorkOrderId cannot be null");
        }

}
 

Ответ №2:

Весенние данные CrudRepository никогда не будут возвращены null findById(ID) . Вы всегда будете получать Optional объект, который либо будет содержать объект с соответствующим идентификатором, либо он будет пустым. Я бы workOrderDTO != null полностью удалил чек.

Если ваш save метод требует ненулевого WorkOrderId значения, я бы утверждал это в начале метода. Например, вы могли бы использовать java.util.Objects.requireNonNull(WorkOrderId)

Эти два изменения упрощают ваш код, поскольку теперь ветвей нет. Это выглядело бы примерно так:

 public TaskDataDTO save(TaskDataDTO taskDataDTO,String WorkOrderId) {
    Objects.requireNonNull(WorkOrderId);
    taskDataDTO.setWorkOrderId(WorkOrderId);
    Optional<WorkOrderDTO> workOrderDTO=workOrderRepository.findById(WorkOrderId).map(workOrderMapper::toDto);
    log.debug("Request to save TaskData : {}", taskDataDTO);
    taskDataDTO.setWorkOrderDTO(workOrderDTO);
    TaskData taskData = taskDataMapper.toEntity(taskDataDTO);
    taskData = taskDataRepository.save(taskData);
    return taskDataMapper.toDto(taskData);
} 
 

Это предполагает, что вы taskDataDTO можете иметь дело с пустым Optional для workOrderDTO . Если это невозможно, вам может понадобиться ifPresent() проверка. Вы также можете рассмотреть возможность перехода WorkOrderDTO в TaskDataDTO , а не в Optional<WorkOrderDTO> .