Не удалось запустить проверку на уровне конструктора

Я не могу запустить проверку параметров конструктора, используя только аннотации.

Мой код:

@Data
@Validated
public class TestConstructorLevel
{
    private int a;
    private int b;

    private Integer nullValue;

    public TestConstructorLevel( int a, int b, @NotNull Integer nullValue )
    {
        this.a = a;
        this.b = b;
        this.nullValue = nullValue;
    }

}

Я ожидаю, когда я буду в какой-то службе

new TestConstructorLevel(1, 2, null)

Я получаю ConstraintViolationException из-за @NotNull, но это не работает.

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

validator.forExecutables().validateConstructorParameters(
            ReflectionUtils.accessibleConstructor( TestConstructorLevel.class, int.class, int.class, Integer.class ),
            new Object[] { 2,1, null } );

но это не подходит.

Я попытался создать класс TestConstructorLevel как компонент Spring, и ничего не изменилось.

Итак, мой вопрос: Какую аннотацию мне нужно использовать для запуска проверки в конструкторе.

PS. Это приложение SpringBoot,


person Simpson    schedule 21.12.2019    source источник


Ответы (1)


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

Аннотация — это просто аннотация. Он просто предоставляет некоторые метаданные относительно аргумента конструктора.

Валидатор может использовать эти метаданные для проверки. Но конструктор остается именно конструктором.

person JB Nizet    schedule 21.12.2019
comment
Я не пытаюсь ничего изменить в конструкторе класса, я просто хочу проверить параметры конструктора. То же, что и проверка параметров метода здесь: code @Service @Validated public class MyService{ public boolean methodParameterValidation( @NotNull Integer value) { return false; } } code - person Simpson; 21.12.2019
comment
Вы ожидаете, что вызов конструктора вызовет исключение проверки только потому, что вы добавили аннотацию к одному из его аргументов. Я пытаюсь объяснить, что это нереалистичное ожидание, потому что аннотации — это не аннотации. Они не меняют поведение конструктора, как вы ожидаете. - person JB Nizet; 21.12.2019
comment
Проверка аргументов метода bean-компонента Spring работает только потому, что Spring не просто вызывает метод: он обнаруживает аннотацию, перехватывает вызовы метода благодаря прокси-серверу, вызывает API проверки для проверки аргументов, а затем, наконец, вызывает метод. если аргументы верны. - person JB Nizet; 21.12.2019
comment
Я имел в виду, что аннотации - это просто аннотации в моем предыдущем комментарии. - person JB Nizet; 21.12.2019
comment
Я не понимаю принципиальной разницы между методом и конструктором, которая не позволяет применить к конструктору автоматическую пружинную проверку. Почему мы можем проверять параметры метода, но не можем проверять параметры конструктора? - person Simpson; 21.12.2019
comment
Я объяснил это в своем предыдущем комментарии. Создайте простой тест, в котором вы создаете экземпляр своего сервиса, используя new MyService(). затем вызовите аннотированный метод метода с недопустимыми аргументами. Вы тоже не будете исключением. Поскольку аннотация ничего не меняет в коде метода. Опять же, это работает, когда вы используете его как внедренный bean-компонент Spring, потому что Spring обнаруживает аннотацию, создает прокси-сервер вокруг bean-компонента, который перехватывает вызовы метода, и вызывает API-интерфейс проверки (так же, как вы это сделали) перед фактическим вызовом метод. - person JB Nizet; 21.12.2019
comment
Слушай, я пытался манипулировать только Spring Beans. Есть ссылки на github Неверный bean-компонент Конструктор bean-компонента, который я хочу проверить И здесь я внедряю bean-компонент ссылка - person Simpson; 21.12.2019
comment
Это совсем другой вопрос. Вопрос в том, поддерживает ли Spring проверку конструктора bean-компонентов? И я не думаю, что это так. Честно говоря, я бы просто написал проверку if в конструкторе. - person JB Nizet; 21.12.2019
comment
Ты прав. Spring не имеет такой функции. Возможно, потому что проверка на уровне конструктора выглядит бесполезной. Спасибо! - person Simpson; 26.12.2019