Руководство и конфигурацию пакетов
Импорт JSR 303 пакеты и спящие достоверные пакеты
<dependency> <groupid> org.hibernate.validator </groupid> <artifactid> hibernate-validator </artifactid> <sersive> 6.0.5.final </version> </depertive> <Depective> <groupId> javax.validation </GroupId> <ArtifactId> ardation-api </artifactid> <версия> 2.0.0.final </version> </depervice>
Конфигурация Springboot
Resources/Application.yml Сообщения Файл ресурсов Международная конфигурация обработки
весна:
Сообщения:
BaseName: Base, Todo # Files Files Base.properties и Todo.properties, разделенные запятыми
Кодирование: UTF-8 # Кодирование анализа
Настройка в классе запуска Springboot
@Springbootapplicationpublic Class Application Extends webmvcconfigurerAdapter {@Value ("$ {Spring.Messages.Basename}") Private String BaseName; public static void main (string [] args) {SpringApplication.run (Application.class, args); } @Bean @primary publicessourceource speakyource () {resourcebundlemessagesource resourcebundlemessagesource = new ResourceBundlemessAgesource (); resourcebundlemessagesource.setusecodeasdefaultmessage (false); resourcebundlemessagesource.setDefaultEncoding ("UTF-8"); // Повторное определение ResourceBundlemessagesource.setBasEnames (baseName.split (",")); return resourcebundlemessagesource; } @Bean @primary public localvalidatorfactorybean valyator () {localValidatorFactoryBean valyatorFactoryBean = new LocalValidatorFactoryBean (); valistatorfactorybean.setProviderClass (hibernatevalidator.class); valyatorFactoryBean.SetValidationMessAgesource (messageSource ()); return valyatorfactorybean; } @Override public valyator getValidator () {return valyator (); } / *** Проверка единого параметра на уровне метода включена* / @bean public methodvalidationpostprocessor methodvalidationpostprocessor () {return new MethodValidationPostProcessor (); }}Мы обрабатываем исключения, которые не могут передать параметры проверки и не можем пройти сброшенные, которые проходят с помощью единого захвата исключений.
@ControlerAdvice @componentPublic class bindValidexceptionHandler {@ResponseStatus (value = httpStatus.ok) @ExceptionHandler (constraintViolationException.class) public @Responsebody msg handleconstraintviolationException (constraintViolationExcept e.getConstraintViolations (). iterator (). Next (). GetMessAgeTemplate (); вернуть msg.error (messagetemplate); } @ResponsEStatus (value = httpstatus.ok) @exceptionhandler (bindexception.class) public @responsebody msg handbindexception (bindException e) {bindingResult bindingResult = e.getBindingResult (); String className = bindingResult.getTarget (). GetClass (). GetName (); FielderRor Next = BindingResult.getFielderRors (). Iterator (). Next (); String FieldName = next.getField (); String defaultmessage = next.getDefaultmessage (); if (pattern.compile ("allogalargumentException: no enum"). Matcher (defaultmessage) .find ()) {matchter matcher = pattern.compile ("for value '(.*?)'"). Matcher (defaultmessage); if (matcher.find ()) {defaultmessage = "Тип перечисления не может быть найден [" + matcher.group (1) + "]"; }} return msg.error (defaultmessage); } @ResponseStatus (value = httpstatus.ok) @exceptionhandler (validerror.class) public @responsebody msg handlevaliderror (validerror e) {return msg.error (e.getmessage ()); }}Ресурсы/Base.propertie
CreatorId = идентификатор Creator не может быть меньше, чем {value}.
MODIFIERID = идентификатор модификатора не может быть меньше, чем {значение}.
Ресурсы/TODO.Properties
todo.privateid.min = частный идентификатор не может быть меньше, чем {value}.
Используйте аннотации в поле Bean, где интерфейсы C и S в группе относятся к аббревиатуре контроллера и услуги, которые включают интерфейс вставки, интерфейс обновления и т. Д., Которые являются пользовательскими конвенциями.
/*** Частный идентификатор-это иностранный ключ, представляющий несколько таблиц, таких как задачи проекта/непроектные задачи/риски/проблемы/обзор вопросов о делах*/@min (значение = 1, сообщение = "{todo.privateid.min}", группы = {c.insert.class, c.update.class, s.insert.class, s.update.class. */@Min (value = 1, message = "{creatorid}", group = {s.insert.class}) private long creatorid; проверка управления контроллером@wervated@restcontroller@requestmapping ("todo") public class todocontroller {@autowipared todoservice todoservice; @Getmapping ("getvo") public msg getVo (@min (value = 1, message = "to Do Most не может быть меньше 1.") @RequestParam (обязательно = false, defaultValue = "0") Long Id) {return this.todoservice.getvo (id); } @Postmapping ("add") public msg add (@validated ({c.insert.class}) todo todo) {return this.todoservice.add (todo); }}@Validated ({c.insert.class}) объявляет, что для включения групп проверки по аннотации бобов, а другие группы проверки не будут выполнять проверку, которую можно различить для отдельной проверки.
Например, если нет объекта и только одного основного типа данных, его можно проверить, но необходимо выполнить три условия:
Проверьте самостоятельно.
Служба услуг AOP проверка
Validutil Tool Class
Нужно отсканировать и зарегистрировать в качестве одного случая Springboot
@Componentpublic class valyutil {@autowired Private Validator Validator; public <t> set <constraintViolation <t>> validate (t object, class <?> ... группы) {return validator.validate (Object, группы); } public <t> set <constraintViolation <t >> validatevalue (class <t> beantype, String PropertyName, значение объекта, класс <?> ... группы) {return valyator.validateValue (beantype, PropertyName, значение, группы); } / *** Проверьте параметр и верните первую подсказку ошибки* @param t Проверенный объект* @param Группы Проверенная группа* @param <t> Оригинальный тип перед стиранием объекта* @return Первая подсказка ошибки* / public <t> validandreturnfirsterrortips (t t, class <?> ... группы) {set <testaintViolation <t>> vailidate = validator.validate (t, validator.validate (t, validator.validate (t, validator.validate (t, validator.validate (t, validator.validate (t, validator. if (validate.size ()> 0) {constraintViolation <t> next = validate.iterator (). Next (); String Message = next.getRootbeanClass (). GetName () + "-" + next.getPropertyPath () + "-" + next.getMessage (); бросить новый ValiderRor (сообщение); }} / *** Проверьте параметр и верните первую приглашение на ошибку* @param targetclass Тип класса объекта, который проверен* @param fieldname name, который необходимо проверить* @param obj значения свойства. obj, class <?> ... группы) {set <constraintViolation <t >> validate = varidator.validateValue (TargetClass, FieldName, OBJ, группы); if (validate.size ()> 0) {string message = targetClass.getName () + "-" + fieldName + "-" + validate.iterator (). Next (). getMessage (); бросить новый ValiderRor (сообщение); }}}Конфигурация AOP
Основным принципом является использование метода перехвата AOP для выполнения параметров и получения аннотаций для параметров. Затем используйте класс инструментов, чтобы проверить параметры. Если проверка не удастся, пользовательская ошибка будет выброшена непосредственно, и пользовательская ошибка была обработана во всем мире.
@Ampost @ComponentPublic Class ValidatorAop {@autowired private validutil valyutil; /*** Определите правила перехвата: перехватить все классы под пакетом Com.service, есть методы с аннотацией @Service. */ @Pointcut("execution(* com.service..*(..)) and @annotation(org.springframework.stereotype.Service)") public void controllerMethodPointcut() { } /** * Specific implementation of interceptor*/ @Around("controllerMethodPointcut()") // Specify the interceptor rules; Вы также можете напрямую написать «выполнение (* com.xjj .........)» в этом общедоступном объекте -перехватчике (выполнение Jointpoint pjp) {methodignature methodignature = (methodingignature) pjp.getSignature (); Метод метод = methodignature.getmethod (); Аннотация [] [] argannotations = method.getParameterannationations (); Object [] args = pjp.getargs (); for (int i = 0; i <args.length; i ++) {for (аннотация аннотации: argannotations [i]) {if (valyed.class.isinstance (аннотация)) {vallicated = (valyted) annotation; Класс <?> [] Groups = valyed.value (); validutil.validandreturnfirsterrortips (args [i], группы); }} try {return pjp.proecd (args); } catch (throwable) {throwable.printstacktrace (); } вернуть true; }}Проверьте аннотацию @min @notnull метод использования
Нельзя записано на классе реализации, в интерфейсе можно использовать только аннотации.
В основном так же, как и контроллер
@Validatedpublic interface todoservice { / *** Query Single to-do* @param ID Serial Number* @return Single To-do* / msg getVo (@min (value = 1, message = "to-do идентификатор не может быть меньше 1.") Long Id); / *** Добавить данные* @param todo объект*/ msg add (@validated ({s.insert.class}) todo todo);}Поделиться несколько пользовательских аннотаций проверки
Строка нулевой проверки
пакет javax.validation.constraints; импорт javax.validation.constraint; импорт javax.validation.constraintvalidator; импорт javax.validation.constraintvalidatorContext; импорт javax.validation.payload; импорт java.lang.annotation.*;/*** ******************************* Его нельзя использовать и необходимо перезаписать. Пакет не может быть изменен. */@Документировано@constraint (valyatedby = {notblank.notblankvalidator.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@artentention (ardententypolicy.runtime) public @Interface notBlank {class <?> [] [) Group () defbletime); String message () по умолчанию "{notBlank}"; Класс <? Extends Payload> [] PAYLOAD () DEFALT {}; Класс notblankvalidator реализует constraintvalidator <notblank, object> {public notblankvalidator () {} @Override public void инициализация (notblank constraintantation) {} @Override public boolean isvalid (объект, constraintvalidatorContext context) {return Value! }}}Тип суждения, чтобы определить, является ли тип одним из значений, вы можете настроить суждение на основе группы проверки
ресурсы/todo.propertiestodo.todotype.insert = при вновь добавлены, тип дел может быть только одной из задач, не являющихся проектами, задачи проекта или задач. todo.todotype.update = При изменении тип дел может быть только одним из рисков и просматривать проблемы с дел. bean/*** todotype0non-project task1project task2problem3risk4reviewtophyvalid (value = {"0", "1", "2"}, message = "{todo.todotype.insert}", группы = {c.insert.class, s.insert.class}@todotydid ward@todotydid@todotydid wardyv "4"}, message = "{todo.todotype.update}", group = {c.update.class, s.update.class}) частная строка todotype;Пользовательские аннотации
@Документирован@constraint (valytedby = {todotyvalid.todotypalidfactory.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@artentention (armentpolicy.runtum По умолчанию «Пожалуйста, введите правильный тип»; String [] value () default {}; Class <?> [] Groups () default {}; Класс <? Extends Payload> [] PAYLOAD () DEFALT {}; Класс TodotypalidFactory реализует ConstraintValidator <todotyvalid, String> {private String [] annotationValue; @Override public void инициализируется (todotyvalid todostatusvalid) {this.annotationValue = toDoStatusValid.value (); } @Override public boolean isValid (строковое значение, контекст constraintValidatorContext) {if (arrays.aslist (annotationValue) .contains (value)) return true; вернуть ложь; }} @Target ({elementType.field, elementtype.annotation_type, elementtype.parameter}) @retention (armentpolicy.runtime) @documented @Interface List {toDotyValid [] value (); }}@Repeatable (todotyvalid.list.class)-это та же аннотация многократная функция, поддерживаемая JDK8.
Согласно вышесказанному, его также можно использовать на классах перечисления.
Когда ресурсы/todo.propertiestodo.todostatus.insert = добавить в новый, статус может быть только не запущен. Когда todo.todostatus.update = изменен, статус может быть только в процессе или завершен. bean/*** todo status 0 не запускается 1 в процессе 2 завершен*/@todostatusvalid (enums = {todostatus.not_started}, message = "{todo.todatus.insert}", группы = {c.insert.class, s.insert.class})@todostatusvalid (inum.class. {Todostatus.processing, todostatus.completed}, message = "{todo.todostatus.update}", group = {c.update.class, s.update.class}) private todostatus todostatus;Пользовательские аннотации
@Документирован@constraint (valyatedby = {todostatusvalid.todostatusvalidfactory.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@artentention (streationpolicy.runtum Todostatusvalid {string message () по умолчанию «Пожалуйста, введите правильный статус»; Todostatus [] enums () по умолчанию {}; Class <?> [] Groups () default {}; Класс <? Extends Payload> [] PAYLOAD () DEFALT {}; класс todostatusValidFactory реализует ConstraintValidator <todostatusvalid, todostatus> {private todostatus [] enums; @Override public void инициализируется (todostatusvalid todostatusvalid) {this.enums = todostatusvalid.enums (); } @Override public boolean isvalid (значение todostatus, контекст constraintvalidatorcontext) {todostatus [] values = todostatus.values (); if (enums! = null && enums.length! = 0) {values = enums; } if (arrays.aslist (values) .contains (value)) return true; вернуть ложь; }} @Target ({elementType.field, elementtype.annotation_type, elementtype.parameter}) @retention (armentpolicy.runtime) @documented @Interface List {toDoStatusValid [] value (); }}Суммировать
Выше приведено то, что редактор, введенный в Springboot, использует JSR 303 для проверки уровня управления контроллером и проверки AOP Service Service. Используйте файлы ресурсов сообщений для интернационализации сообщений. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!