Метод Spring Data JPA findById () возвращает null вместо Empty Необязательно

У меня есть метод, использующий Spring Data. Метод findById () JPA должен возвращать Optional. Однако, если сущность не найдена по указанному идентификатору, она возвращает ноль вместо пустого необязательного.

 public TicketEntity findTicket(String ticket) throws EntityNotFoundException {

    Optional<TicketEntity> op = ticketEntityRepository.findById(ticket);

    TicketEntity ticketEntity = op.orElseThrow(() -> new EntityNotFoundException("ticket with the id " + ticket + " not found in the system"));

    return ticketEntity;
}

Во время отладки я обнаружил, что значение op равно нулю. Это фрагмент кода, который дает сбой. Я использую Spring Data JPA 2.0.8.RELEASE. Пожалуйста помоги

похоже значит? Синтаксис?

Akhil Prajapati 27.06.2018 11:21

Код @YCF_L генерируется данными Spring jpa

gagan singh 27.06.2018 11:24

findById () - это метод, определенный Spring-data-jpa. Я не определил этот метод

Akhil Prajapati 27.06.2018 11:24

ой, мой плохой @gagansingh, извините, я думал, что OP создаст его вручную

YCF_L 27.06.2018 11:24

посмотрите документы о допустимости пустых значений

gagan singh 27.06.2018 11:35

Предоставьте воспроизводимый тестовый пример и сообщите об ошибке. Этого не должно происходить.

Jens Schauder 27.06.2018 11:46

Это в реальной системе или во время тестирования с фиктивными зависимостями.

M. Deinum 27.06.2018 14:00

@ M.Deinum Это не живая система. Я пытаюсь запустить тесты с фиктивными зависимостями

Akhil Prajapati 28.06.2018 12:10

И null - это ответ по умолчанию для имитации. Вам нужно будет сказать макету, что он должен вернуть Optional.empty().

M. Deinum 28.06.2018 12:20

@ M.Deinum Вы должны опубликовать этот комментарий в качестве ответа, потому что это основная причина. Я изменил макет, чтобы вернуть Optional.empty (), и он работал как шарм. Большое спасибо за твою помощь. Я действительно ценю это.

Akhil Prajapati 28.06.2018 12:25

Предполагая, что вы используете Mockito, он должен фактически вернуть пустой необязательный параметр. Какую версию Spring Boot и Mockito вы используете? См. github.com/mockito/mockito/issues/1416#issuecomment-40115325‌ 4

M. Deinum 28.06.2018 22:01

проверьте это решение: stackoverflow.com/a/49967692/5872337

Geet Thakur 07.12.2018 09:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
12
11 004
3

Ответы 3

Строка кода

Необязательный op = ticketEntityRepository.findById (билет);

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

Список op = ticketEntityRepository.findById (тикет) .orElse (новый ArrayList ());

так что метод findById должен возвращать объект или null, тогда зачем возвращать необязательный? вот в чем вопрос.

gagan singh 27.06.2018 11:37

Какова реализация вашего класса репозитория? У меня работает следующий репозиторий и тестовый пример.

@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonRepoTest {

    @Autowired
    private PersonRepository personRepository;

    @Test
    public void testFindById(){
        Optional<Person> byId = personRepository.findById(1);
        Assert.assertTrue(byId != null);
    }
}

public interface PersonRepository  extends CrudRepository<Person, Integer> {
}

В комментарии вы заявляете, что это тест с фиктивными зависимостями. Мокинг полностью исключает Spring Data JPA из картинки, поскольку теперь это просто прокси, реализованный с помощью макета из Mockito.

По умолчанию макет возвращает null.

By default, for all methods that return a value, a mock will return either null, a primitive/primitive wrapper value, or an empty collection, as appropriate. For example 0 for an int/Integer and false for a boolean/Boolean.

Поскольку вы работаете с макетом, вам нужно будет указать ему вернуть Optional.empty(), иначе вы получите null.

ПРИМЕЧАНИЕ: Вы можете создать запрос на улучшение для Mockito, чтобы по умолчанию возвращался Optional.empty в случае типа возврата Optional.

Как бы вы его проинструктировали? Учитывая пример строки кода: Mockito.when (repository.findById (Mockito.any ()). OrElse (null) ‌) .thenReturn (myValue‌);

Fatmajk 11.02.2020 10:59

Другие вопросы по теме