Как я могу выполнить bean-валидацию с репозиториями Spring?

Я пытаюсь использовать свой интерфейс репозитория, выглядит так.

interface SomeRepository extends JpaRepository<Some, Long> {

   @org.springframework.lang.Nullable
   Some findByKey(
            @org.springframework.lang.NonNull
            @javax.validation.constraint.NotNull
            final String key);
}

И я обнаружил, что эти ограничения работают не так, как ожидалось.

@Test
void findByKeyWithNullKey() {
    repository.findByKey(null);
}

Тестовый пример просто проходит.

Как заставить его работать?

2
0
779
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы предложил использовать проверку javax в вашей весенней структуре и предположить, что если вы используете maven, вам просто нужно включить ниже зависимость

<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

после этого попробуйте код ниже

Some findByKey(
            @NotNull final String key);
Ответ принят как подходящий

Согласно Документ Spring JPA:

Чтобы включить во время выполнения проверку ограничений допустимости значений NULL для методов запроса, необходимо активировать недопустимость NULL на уровне пакета с помощью Spring @NonNullApi.

вы можете добавить аннотации пакетов, просто создав файл package-info.java и добавив в него объявление пакета, к которому он относится. Затем добавьте эту аннотацию в свой пакет следующим образом:

@org.springframework.lang.NonNullApi
package com.example;

Я работаю как ты сказал. Охватывает ли он все проверки bean-компонентов, например @Size?

Jin Kwon 17.09.2018 11:57

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

kingGarfield 17.09.2018 12:12

Он работает, когда вы вставили код. Конечно, вам нужно использовать @Repository в репо и удалить @ javax.validation.constraint.NotNull, поскольку это не то, что вы хотите. Кроме того, вам необходимо убедиться, что у вас есть правильный импорт в pom. Я бы рекомендовал сделать обратное, добавив ненулевой api на уровне пакета, а затем:

Rule findOneByExpression(@Nullable String expression);
ruleRepository.findOneByExpression(null);

И посмотрите, как он потерпит неудачу, если он вернет null. Затем измените его так:

@Nullable 
Rule findOneByExpression(@Nullable String expression);

И это пройдет.

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