Проверка пружины: ограничение параметра метода не вызывается - PullRequest
1 голос
/ 27 февраля 2020

каждый.

Итак, у меня есть приложение SpringBoot с контроллером, у которого есть несколько методов, принимая в качестве параметра следующий POJO:

package com.example.dto;

import lombok.Data;

@Data
public class MyEntity {
   @NotNull
   private String fieldA;

   private String fieldB;
}

Для одной из конечных точек контроллера I Я хотел бы применить дополнительную логику проверки c, поэтому в validation.xml я добавляю следующее:

<constraint-mappings>
    <bean class="com.example.controller.SampleController" ignore-annotations="false">
        <method name="doFoo">
            <parameter type="com.example.dto.MyEntity">
                <valid />
                <constraint annotation="com.example.validation.ValidEntity" />
            </parameter>
        </method>
    </bean>
</constraint-mappings>

com.example.validation.ValidEntity - это аннотация ограничения, которую я хотел бы применить.

Моя проблема в том, что это дополнительное ограничение вызывается только в том случае, если проверки @NotNull, определенные в MyEntity, прошли успешно. Если fieldA равно нулю, ограничение ValidEntity игнорируется, и клиент получает неполный результат проверки. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я не знаю, существует ли простой способ настроить валидатор для агрегирования нарушений ограничений как из аннотации, так и из конфигурации XML, когда первый или оба не удаются.

Как показывает ваш код Hibernate Validator может работать со смешанными аннотациями и XML конфигурациями, но отсутствие документации для этого конкретного случая c указывает на то, что по крайней мере это не рекомендуется.

Когда XML конфигурация Файл используется, он имеет приоритет над аннотациями по умолчанию. ignore-annotations используется для преодоления этого (выделение текста - мое):

Установка ignore-annotations в значение true означает, что аннотации ограничений, помещенные в сконфигурированный компонент, игнорируются. Значением по умолчанию для этого значения является true . ignore-annotations также доступно для узлов class, fields, getter, constructor, method, parameter, cross-parameter и return-value. Если не указано явно на этих уровнях, сконфигурированное значение компонента применяется .

Использование Hibernate Validator для удовлетворения ваших потребностей в валидации В статье говорится, что:

Значением по умолчанию для поля является ignore-annotations=”false”. Это означает, что по умолчанию аннотации для поля сильнее (это, конечно, после того, как вы указали, что этот компонент не будет игнорировать аннотации). Если вы хотите, чтобы XML был сильнее, чем вы должны указать, то ignore-annotations=”true”

Кажется возможным отключить настройку аннотации для указанного поля c, настроенного в XML.

Другим решением для переключения между аннотацией и XML является использование Ограничения группировки .

Я не уверен, что что-либо из перечисленного выше использовать для вас, но если это возможно, я бы, вероятно, переключился бы на одну конфигурацию (XML, предполагая, что конфигурация аннотации происходит из внешней библиотеки, которую вы не можете изменить), и использовал бы ее везде, вместо того, чтобы полагаться на недокументированные функции.

0 голосов
/ 27 февраля 2020

Я не совсем уверен в этом, потому что я никогда не работал с файлом validation.xml.

Однако я бы сказал, что Spring сначала создает объект, а затем применяет проверки. Проверка @NotNull выполняется при создании экземпляра. Это означает, что если эта проверка не пройдена, конструкция выдаст исключение, и Spring даже не попытается проверить ваше ограничение (что, на мой взгляд, имеет смысл).

Я думаю, что вы можете «исправить» его, создав аннотации с вашим ограничением и использование его в вашем классе. Если я прав, обе аннотации будут проверены, и выброшенное исключение будет содержать все ошибки.

Это всего лишь предположение. Дайте мне знать, если это работает.

...