Guía y configuración de paquetes
Importar paquetes JSR 303 y paquetes válidos de hibernación
<Spendency> <MoupRoD> org.hibernate.validator </groupid> <artifactID> hibernate-validator </arfactid> <verserse> 6.0.5.final </verversion> </pendency> <pendency> <grupo> javax.validation </groupid> <Atifactid> validation-api </artifactid> <Versión> 2.0.0.Final </Version> </Dependency>
Configuración de SpringBoot
recursos/application.yml Mensaje Archivo de recursos Configuración de procesamiento internacional
primavera:
Mensajes:
BaseName: Base, TODO # Archivos de recursos Base.Properties y TODO.Properties, separadas por comas
Codificación: se debe especificar la codificación de análisis UTF-8 #, de lo contrario, código de confusión chino
Configurar en la clase de inicio de SpringBoot
@SpringBootApplicationPublic Sploling de clase extiende WebMVCConfigurerAdapter {@Value ("$ {spring.messages.basename}") privado string basename; public static void main (string [] args) {springapplication.run (application.class, args); } @Bean @Primary Public MessageOurce Messagesurce () {ResourceBundLemesSageSource ResourceBundLemesSageSource = new ResourCebundLemessAsseurce (); ResourceBundLemesSageSource.setUsecodeasdefaultMessage (falso); ResourceBundLemesSageSource.setDefaultEncoding ("UTF-8"); // Repetir definición ResourceBundLemesSageSource.setBasenames (Basename.split (",")); return ResourceBundLemesSageSource; } @Bean @Primary public localValidatorFactoryBean Validator () {localValidatorFactory ValidatorFactoryBean = new LocalValidatorFactoryBean (); ValidatorFactoryBean.SetProviderClass (hibernateValidator.class); ValidatorFactoryBean.SetValidationMessageSource (Messagesurce ()); devolver validatorFactoryBean; } @Override public Validator getValidator () {return Validator (); } / *** La verificación de parámetros únicos en el nivel de método está habilitado* / @Bean public MethodValidationPostPossor MethodValidationPostPossor () {return New MethodValidationPostPossor (); }}Procesamos excepciones que no pueden pasar los parámetros de verificación y no pueden pasar el lanzamiento, que es a través de captura de excepciones unificadas.
@ControlerAdvice @componentPublic la clase bindValidExceptionHandler {@ResponseStatus (valor = httpstatus.ok) @ExceptionHandler (restrictsViolationException.class) public @ResponseBody MSG HANDLECSTRAINTVIOLATIONException (restrictViolationException e) {string MessagetEmate = = E.getConstraintViolations (). Iterator (). Next (). GetMessageTemplate (); return msg.error (MessageTemplate); } @ResponseStatus (value = httpstatus.ok) @exceptionHandler (bindException.class) public @ResponseBody Msg Hanebindexception (bindException e) {bindingResult bindingResult = e.getBindingResult (); Cadena className = bindingResult.getTarget (). GetClass (). GetName (); Fielderror Next = BindingResult.getFielderRors (). Iterator (). Next (); String fieldName = next.getField (); Cadena defaultMessage = next.getDefaultMessage (); if (patrón.compile ("ilegalArGumentException: no enum"). matcher (defaultMessage) .find ()) {matcher matcher = patrón.compile ("para valor '(.*?)'"). matcher (defaultMessage); if (matcher.find ()) {defaultMessage = "El tipo enum no se puede encontrar [" + 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 ()); }}Recursos/Base.Propertie
creatorId = creador de identificación no puede ser menor que {valor}.
ModifierId = ID de modificador no puede ser menor que {valor}.
Recursos/TODO.Properties
TODO.PRIVATEID.min = ID privado no puede ser menor que {valor}.
Use anotaciones en el campo Bean, donde las interfaces C y S en el grupo se refieren a la abreviatura del controlador y el servicio, que incluyen la interfaz de inserción, la interfaz de actualización, etc., que son todas las convenciones personalizadas.
/*** La identificación privada es la clave extranjera que representa múltiples tablas, como tareas de proyecto/tareas sin fines de proceso/riesgos/problemas/revisión de preguntas de TO-do*/@min (valor = 1, mensaje = "{TODO.PRIVATEID.min}", grupos = {c.insert.class, c.Update.class, s.insert.class, s.update.class}) privado privado privado)/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ID ID; */@Min (valor = 1, mensaje = "{CreatorId}", grupos = {s.insert.class}) Private Long CreatorId; VERIFICACIÓN DE Capa de control del controlador@validada@RestController@requestmapping ("TODO") Public Class ToDocontroller {@AUTOWIREDED Private ToDoservice toDoservice; @GetMapping ("getvo") public msg getvo (@min (value = 1, mensaje = "para hacer id no puede ser menor que 1.") @RequestParam (requerido = false, defaultValue = "0") Long ID) {return this.todoservice.getvo (id); } @Postmapping ("add") public msg add (@Valided ({C.insert.class}) toDo toDo) {return this.todoservice.add (toDo); }}@Validated ({C.insert.class}) declara para habilitar grupos de verificación sobre la anotación de frijoles, y otros grupos de verificación no realizarán verificación, que se puede distinguir para una verificación separada.
Por ejemplo, si no hay entidad y solo un tipo de datos básico, se puede verificar, pero se deben cumplir tres condiciones:
Verifique por sí mismo.
VERIFICACIÓN DE SERVICIO DE SERVICIO AOP
Clase de herramientas de validutil
Necesita ser escaneado y registrado como un solo caso por SpringBoot
@ComponentPublic Class Validutil {@autoWired Validador de validador privado; public <t> set <restrictViolation <T>> validar (objeto t, clase <?> ... grupos) {return Validator.Validate (objeto, grupos); } public <T> set <restrictHViolation <T>> validateValue (class <T> beanType, string PropertyName, valor de objeto, clase <?> ... grupos) {return Validator.ValidateValue (beanType, Propertyname, value, grupos); } / *** Verifique el parámetro y devuelva el primer mensaje de error* @param t Objeto verificado* @param grupos grupo verificado* @param <t> Tipo original antes de borrar el objeto* @return Primer error de error* / public <t> void validandreturnFirRortips (t t, clase <?> ... grupos) {restrictViolation <>> validator.valides.validip (t, grupos); if (validate.size ()> 0) {restrictiveViolation <t> next = validate.iterator (). next (); String Message = next.getRootBeanClass (). GetName () + "-" + next.getPropertyPath () + "-" + next.getMessage (); tirar nuevo ValiderRor (mensaje); } } /** * Check the parameter and return the first error prompt* @param targetClass The class type of the object that is validated* @param fieldName Name that needs to be validated* @param obj property value required* @param groups group verification group* @param <T> Original type before object erasing* @return First error prompt*/ public <T> void validAndReturnFirstErrorTips(Class targetClass, String fieldName, Object obj, clase <?> ... grupos) {set <restrictViolation <t>> validate = Validator.ValidateValue (TargetClass, FieldName, OBJ, Grupos); if (validate.size ()> 0) {string Message = TargetClass.getName () + "-" + FieldName + "-" + Validate.Iterator (). Next (). GetMessage (); tirar nuevo ValiderRor (mensaje); }}}Configuración de AOP
El principio principal es utilizar el método de intercepción AOP para ejecutar parámetros y obtener anotaciones para parámetros. Luego use la clase de herramientas para verificar los parámetros. Si la verificación falla, se lanzará directamente un error personalizado y el error personalizado se ha procesado a nivel mundial.
@Aspecto @componentPublic Clase ValidatoraOP {@aUtowired private Validutil Validutil; /*** Definir reglas de intercepción: interceptar todas las clases debajo del paquete Com.Service, hay métodos con anotación @Service. */ @PointCut ("Ejecution (*com.service ..*(..)) y @Annotation (org.springframework.stereotype.service)") public void controlermethodpointcut () {}/ ***Implementación específica de interceptor*/ @around ("ControleMethodpointCutcut ()") // especificando las reglas de interceptor; También puede escribir directamente "Ejecución (* com.xjj .........)" En este interceptor de objeto público (procedimientoJoinPoint PJP) {Methodsignature Methodsignature = (MethodeSignature) pjp.getSignature (); Método método = Methodsignature.getMethod (); Anotación [] [] argannotations = método.getParameterAnnotations (); Objeto [] args = pjp.getArgs (); para (int i = 0; i <args.length; i ++) {para (anotación de anotación: argannotations [i]) {if (validade.class.isinstance (anotación)) {validada validada = (validada) anotación; Clase <?> [] Grupos = Validated.Value (); validutil.validandreturnFirsterRortips (args [i], grupos); }} try {return pjp.proced (args); } catch (showable showable) {showleable.printstackTrace (); } return verdadero; }}Verificar la anotación @min @notnnull Método de uso
No se puede escribir en la clase de implementación, solo se pueden usar anotaciones en la interfaz
Básicamente de la misma manera que el controlador
@ValidatedPublic Interface ToDoservice { / *** Consulta única TO-DO* @param ID Número de serie* @return único para hacer* / msg getvo (@min (value = 1, mensaje = "ID de tareas no puede ser menos que 1.") ID de larga); / *** Agregar datos* @param TODO Object*/ msg add (@Validated ({s.insert.class}) TODO TODO);}Comparta algunas anotaciones de verificación personalizadas
Verificación nula de cadena
paquete javax.validation.constraints; import javax.validation.constraint; import javax.validation.ConstraintValidator; import javax.validation.constraintvalidatorContext; import javax.validation.payload; import java.lang.annotation.*;/*** String null verificación, los problemas de HiBerNate. No se puede usar y debe reescribirse. El paquete no se puede cambiar. */@Documented@restrict (validatedBy = {noTblank.notBlankValidator.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@retención (retenciónPolicy.runtime) public @interface Notblank {class <?> [] Grupos () predeterminado; String Message () predeterminado "{Notblank}"; Clase <? extiende la carga útil> [] Payload () predeterminado {}; La clase NotblankValidator implementa restrictValidator <NotBlank, Object> {public NotBlankValidator () {} @Override public Void Initialize (Notblank RestrictAntAntation) {} @Override public Boolean isValid (valor de objeto, restrictValidatorContext context) {Value de retorno! = Null &&! Value.Tostring (). }}}Tipo de juicio, para determinar si el tipo es uno de los valores, puede personalizar el juicio basado en el grupo de verificación
Resources/TODO.PropertiestODO.Todotype.insert = Cuando recién agregado, el tipo TO-DO solo puede ser una de las tareas, tareas del proyecto o problemas sin proyectos. toDo.todotype.update = Al modificar, el tipo de tareas pendientes solo puede ser uno de los riesgos y revisar los problemas de tareas pendientes. bean/** * TodoType0Non-project Task1Project Task2Problem3Risk4ReviewTodoTypeValid(value = {"0", "1", "2"}, message = "{todo.todoType.insert}", groups = {C.Insert.class, S.Insert.class})@TodoTypeValid(value = {"3", "4"}, mensaje = "{toDo.todotype.update}", grupos = {c.update.class, s.update.class}) string private string toDotype;Anotaciones personalizadas
@Documentado@restricter (validatedBy = {tODotyPeValid.todotyTypeValidFactory.class})@target ({elementType.field, elementType.annotation_type, elementtype.parameter})@retención (retenciónPolicy.RunTime) @Repeatable (toDotypevalid.list.class) {String Message () predeterminado "Ingrese el tipo correcto"; String [] value () predeterminado {}; Clase <?> [] Grupos () predeterminado {}; Clase <? extiende la carga útil> [] Payload () predeterminado {}; clase TODOTYPEVALIDFactory implementa restrictValidator <tODotyPeValid, string> {private String [] anotationValue; @Override public void Initialize (toDotyPeValid toDostatusValid) {this.annotationValue = toDostatusValid.Value (); } @Override public boolean isValid (valor de cadena, contexto de restrictValidatorContext) {if (arrays.aslist (annotationValue) .contains (valor)) return true; devolver falso; }} @Target ({elementType.field, elementtype.annotation_type, elementtype.parameter}) @retention (retentionPolicy.runtime) @documented @interface list {toDotypeValid [] value (); }}@Repeatable (toDotypeValid.list.class) es la misma anotación de la característica múltiple de tiempo compatible con JDK8.
Según lo anterior, también se puede usar en las clases de enumeración.
Cuando recursos/todo.propertiestodo.todostatus.insert = agregar a nuevo, el estado solo no se puede iniciar. Cuando se modifica TODO.TODOSTATUS.Update =, el estado solo puede estar en progreso o completado. Bean/*** TODO Status 0 no se inició 1 en progreso 2 completado*/@toDostatusValid (enums = {toDostatus.not_started}, message = "{toDo.Todostatus.insert}", grupos = {c.insert.class, s.insert.class})@toDostatusvalid (en eneStatats. Todostatus.completed}, message = "{toDo.Todostatus.Update}", grupos = {c.update.class, s.update.class}) Todostatus private Todostatus;Anotaciones personalizadas
@Documentado@restricter (validatedBy = {toDostatusValid.todostatusValidFactory.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@retention (retención TodostatusValid {string Message () predeterminado "Ingrese el estado correcto"; Todostatus [] enums () predeterminado {}; Clase <?> [] Grupos () predeterminado {}; Clase <? extiende la carga útil> [] Payload () predeterminado {}; clase TODOSTATUSVALIDFactory Implementa restricción Validator <TDOSTATUSVALID, TODOSTATUS> {private toDostatus [] enums; @Override public void Initialize (TodostatusValid TodostatusValid) {this.enums = TodostatusValid.enums (); } @Override public boolean isValid (valor de ToDostatus, contexto de restricción ValidatorContext) {toDostatus [] valores = toDostatus.values (); if (enums! = null && enums.length! = 0) {valores = enums; } if (arrays.aslist (valores) .contains (valor)) return true; devolver falso; }} @Target ({elementType.field, elementtype.annotation_type, elementtype.parameter}) @retention (retentionPolicy.runtime) @documented @interface list {tDostatusValid [] valor (); }}Resumir
Lo anterior es lo que el editor introdujo en SpringBoot utiliza JSR 303 para verificar la capa de control del controlador y la verificación de la capa de servicio de servicio AOP. Use archivos de recursos de mensajes para internacionalizar los mensajes. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!