1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mgang-mei-fluent-demo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Демонстрация использования MEI-Fluent

Используется fluent-validator для валидации данных, а также выполняется расширение fluent.

1. Почему требуется расширение

Bean проверка

Пакет Hibernate Validator уже достаточно хорош для серверной проверки данных. Fluent-validator объединяет возможности Hibernate Validator с удобным API для последовательной проверки данных. Однако способ @FluentValidate({xx.class}) и использование пользовательских аннотаций Hibernate Validator аналогичны и предназначены для базовой проверки отдельных свойств объекта, а не для бизнес-логики.

Бизнес-логика проверки

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

Нужность расширения

В ходе работы над проектом было выявлено множество ситуаций, требующих бизнес-логики проверки данных. Поэтому были сделаны простые расширения для удовлетворения этих потребностей.

1.1 Расширенные возможности Hibernate Validator

  • @Dict — выбор одного значения из словаря
  • @DictMulti — выбор нескольких значений из словаря
  • Url — проверка корректности URL

1.2 Расширенные возможности Fluent Validator* IdcardValidator - проверка корректности номера паспорта

  • PhoneValidator - проверка корректности номера телефона
  • UrlValidator - проверка корректности URL (необходимость создания пользовательского сообщения об ошибке)
  • ZipCodeValidator - проверка корректности почтового индекса## 2. Почему требуется выполнение бизнес-логики проверки данных на сервере

Безопасность сайта

Для обеспечения безопасности сайты обычно используют клиентскую и серверную проверку данных. Серверная проверка позволяет фильтровать данные, отправляемые не через интерфейсы сайта, что снижает количество мусора в базе данных.

Улучшение качества данных

Выполнение бизнес-логики проверки данных повышает качество данных путём добавления дополнительных условий проверки.

3. Какие бывают типичные ситуации бизнес-логики проверки данных

Примеры

  • В объекте A свойство A2 зависит от свойства A1. Когда A1 равно 1, A2 не должно быть пустым.
  • В объекте A список B зависит от свойства A1. Когда A1 равно 1, каждое значение B1 в списке B должно быть равно 1.

4. Общий подход к решению задачи

Создание пользовательской аннотации

Создание пользовательской аннотации @Refer, которая позволяет выполнять бизнес-логику проверки данных. Аннотация объединяет преимущества Fluent Validator и Hibernate Validator.```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Refer { String[] param(); // параметры для условия проверки String[] validParam() default {}; // параметры для проверки значений, если не указаны, берутся из аннотации Class<?> validator(); // класс валидатора String message() default ""; // сообщение об ошибке }

```markdown
Класс <?>[] группы() по умолчанию {}; // группировка
}

Использование:
    @Refer(validator = AOneBNotNullValidator.class,
           groups = {G1.class},
           param = {"org.mango.bean.C:c1=110"},
           message = "значение c2 должно быть заполнено при условии c1=110")
private String c2;

Валидатор:
    /**
     * @param param условие параметра
     * @param validparam валидационный параметр
     * @param vc контекст валидации
     * @param msg сообщение об ошибке
     * @return
     */
@Override
public boolean validate(Map<String, Object> param, Map<String, Object> validparam, ValidContext vc, String msg) {
    String bb = this.getString(param, this.getFirstKey(param));
    String eqValue = this.getString(param, this.getFirstKey(param) + "_eqValue");
    if (bb != null) {
        String field = this.getFirstKey(validparam);
        String str = this.getString(validparam, field);
        if (bb.equals(eqValue)) {
            if (str != null && str.length() > 0) {
                return true;
            } else {
                vc.addError(field, msg);
                return false;
            }
        } else {
            return true;
        }
    }
    return true;
}

Валидация теста:
    public static void main(String[] args) {
        C aObj = new C();
        aObj.setA0(1);
        aObj.setA1("test");
        aObj.setA2("");
        B b = new B();
        b.setB1("mango");
        b.setB3("xxx");
        aObj.setB(b);
        try {
            List<String> msgList = ValidUtil.validateAll(aObj, true);
            System.out.println(JSONObject.toJSONString(msgList));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

# 5.
```Дополнительные методы валидации
> больше в <a href="https://gitee.com/mangoorg/mei-fluent-demo/blob/master/fluent-demo/src/main/java/org/mango/validator/util/ValidUtil.java?oid=53e5119b4f8907bfc968242a785ff73384c4847d">ValidUtil.java</a>
# 6. Недостатки решённые с помощью @Refer
* param = {"org.mango.bean.C:c1=110"} передача параметров, гибкая передача нескольких параметров, реализует сценарий бизнес-логики типа if(a1 == 1 && b1 == 1) {c1 и c2 не должны быть пустыми}.
* Базируясь на аннотации @Valid, реализован рекурсивный анализ свойства List или объекта.
* Используя метод class.getSuperclass(), получаем родительское свойство, расширенное через extends.
* org.mango.bean.

C:c1=110, Класс C не является текущим классом, используйте локальный поточно-безопасный map объекта для хранения свойства bean, чтобы обеспечить зависимость между свойствами разных beans.

  • @Valid При применении к атрибуту типа List, не сохраняйте его в локальном поточно-безопасном map, так как зависимости между различными beans невозможно указать для конкретного объекта внутри списка.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Используйте fluent-validator для проверки. Fluent-validator интегрирует hibernate-validator и пользовательские аннотации fluent. В случае, когда невозможно реализовать бизнес-сценарий, реализуйте пользовательскую аннотацию @Refer. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mgang-mei-fluent-demo.git
git@api.gitlife.ru:oschina-mirror/mgang-mei-fluent-demo.git
oschina-mirror
mgang-mei-fluent-demo
mgang-mei-fluent-demo
master