#java #spring #spring-boot #optional #dto
Вопрос:
У меня есть следующий метод, который возвращает DemoDTO
, и если он не найден, возвращает исключение.
public DemoDTO findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid) .orElseThrow(() -gt; new EntityNotFoundException("Not found")); }
Тем не менее, я хочу, чтобы метод возвращал значение null DemoDTO
вместо того, чтобы выдавать ошибку. Для этой цели я преобразовал его тип и связанные типы возвращаемых данных в Optionallt;DemoDTOgt;
или Optionallt;Tgt;
, но это вызвало некоторые проблемы , связанные с соответствующим DTO. После того , как я обновил параметры конструктора Optionallt;Tgt;
, другая часть приложения, которая использовала этот DTO, пожаловалась.
Я не уверен, что преобразование в Optionallt;Tgt;
— хорошая идея или нет. Если это хорошая идея, должен ли я добавить в нее еще один конструктор DemoDTO
? Я не уверен, что это хорошее решение, так как оно также потребует некоторых изменений для типов свойств. Есть идеи?
Комментарии:
1. Что мешает вам изменить свой метод возврата
Optional
? Нравитсяpublic Optionallt;DemoDTOgt; findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid); }
2. Я попробовал, затем мне пришлось внести много изменений из-за необходимых изменений (преобразование в необязательное в DTO). Есть какие-нибудь предложения?
3. В принципе, изменение типа возвращаемого значения на
Optional
является хорошей идеей, потому что таким образом вы можете позволить вызывающему коду решать, что делать с «безрезультатным». Вызывающему не нужно выполнять попытку перехвата, чтобы выяснить, существует ли значение для данного UUID. Конечно, вам нужно изменить, вероятно, много кода. Еще одна возможность:ublic Optionallt;DemoDTOgt; findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid).orElse(null);
. Таким образом, вы избежите возникновения исключения, но вы вернетесьnull
, и вызывающий код должен проверить наличие null, чтобы не выдавать NullPointerExc4. @jmizv Точно!.. Большое спасибо, очень элегантное решение 😉
Ответ №1:
Чтобы включить мой комментарий в ответ, это был бы самый элегантный способ, основанный на ваших требованиях:
public DemoDTO findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid).orElse(null); }
Но убедитесь, что вызывающий код правильно обрабатывает null
, чтобы избежать NullPointerException
s.
Комментарии:
1. Хранение в нем null разрушает всю идею необязательного типа, imo
2. Это правда, но мы ничего не храним
null
в anOptional
.3. На самом деле, невозможно хранить а
null
вOptional
А.