#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>
.