1: conceptos básicos de validador hibernado
1. Introducción:
Al usar las anotaciones de anotaciones para agregar restricciones a los atributos de una clase o clase, verifique la legalidad del valor del atributo durante el tiempo de ejecución.
2. Función:
La verificación de los parámetros es muy importante en el desarrollo de la interfaz API, porque el cliente puede pasar menos parámetros, o el valor es ilegal, o incluso el valor del parámetro es maliciosa, por lo que la legalidad de los parámetros transmitidos por el cliente debe verificarse. Entre ellos, la anotación de las reglas de verificación de los valores de los parámetros a los atributos a través de la anotación es una forma relativamente elegante.
3. Anotaciones de restricción comúnmente utilizadas
4. Obtenga un validador hibernado por primera vez
Dirección de clase pública {@notnull private String Line1; línea de cadena privada2; cadena privada zip; estado de cadena privada; @Length (max = 20) @notnull private String country; @Range (min = -2, max = 50, mensaje = "piso fuera de rango") Public int Floor; // getter && setter}Dos: integrar la verificación del validador hibernato
Este ejemplo está integrado en función de SpringMVC+FastJson Integration (//www.vevb.com/article/139094.htm). Primero puede mirar este artículo (con código fuente para descargar) e integrar Hibernate-Validator en función de este artículo.
Pasos de integración:
1. Introducir la dependencia del validador hibernado en pom.xml
<Spendency> <MoupRoD> org.hibernate </groupid> <artifactId> hibernate-validator </artifactid> <versión> 5.4.1.final </versión> </pendency>
2. Configure el validador en [xxx] -servlet.xml: HibernateValidator
< <valor> text/html; charset = utf-8 </value> <value> Application/Json </value> </list> </Property> <Property Name = "Características"> <list> <valor> quotefieldnames </value> <alon valor> writeMapnullValue </value> </list> </ bean> </mvc: sessessgo-converter id = "Validator"> <Property name = "ProviderClass" value = "org.hibernate.validator.HibernateValidator"/> <Property name = "ValidationMessageSource" ref = "Messessource"/> </bean> <bean id = "Messagesurce"> <name de propiedad = "basenames"> <List> <list> <value> classpath: org/hibernate/validator/validationMessages </value> </list> </propine> <Property name = "useCodeasdefaultMessage" valor = "false"/> <propiedad name = "defaultEding" valor = "utf-8"/> <name de propiedad = "Cachesegunds" valor = "60"/> </> </> </bean>
3. Definir la descripción del archivo del mensaje de verificación Validación.
validation.common.not.null = este campo no puede ser validación vacía.common.not.range = longitud validación ilegal.common.format.error = formato Validación de error
4. Cree una nueva clase de entidad para las pruebas
Entrega de usuario
paquete com.mengdee.manage.validator; import javax.validation.constraints.min; import javax.validation.constraints.notnull; import javax.validation.constraints.null; import javax.validation.constraints.pattern; import org.hibernate.validator.constraints.length; import org.hibernate.validator.constraints.notblank; public class userEntity {@null (grupos = {groupa.class}) identificación; @Notblank (grupos = {groupa.class, groupb.class}) @Pattern (regexp = "^(?! [0-9]+$) (? Groupb.class}) contraseña de cadena privada; @Notblank (grupos = {groupa.class, groupb.class}) @Pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $", Mensaje = "El formato de número de teléfono móvil está incorrecto") Película privada; @Notblank (grupos = {groupb.class}) @length (min = 6, max = 12, mensaje = "La longitud del apodo es de 6 a 12 bits") apodo de cadena privada; @Min (valor = 18, mensaje = "{validation.param.age}") private int Age; @Notblank (grupos = {groupa.class}) @email (mensaje = "{validation.common.format.error}") privado cadena por correo electrónico; @Notblank @Length (min = 3, max = 10, mensaje = "{validation.common.not.range}") String private String UserName; Public UserEntity () {} public Long getId () {return id; } public void setid (ID long) {this.id = id; } public String getNickName () {return Npokname; } public void setNickName (String Nickname) {this.nickName = Nickname; } public int getAge () {return Age; } public void setAge (int Age) {this.age = edad; } public String getEmail () {return email; } public void setEmail (correo electrónico de cadena) {this.email = correo electrónico; } public String getPassword () {return Password; } public void setPassword (String Password) {this.password = contraseña; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getPhone () {return Phone; } public void setphone (teléfono de cadena) {this.phone = phone; }}Usermodelo
paquete com.mengdee.manage.validator; import javax.validation.constraints.min; import javax.validation.constraints.pattern; import org.hibernate.validator.constraints.email; import org.hibernate.validator.constraints.length; import Usermodel {@min (valor = 1, mensaje = "El valor de identificación debe ser mayor que 0") ID de largo privado; @Notblank @Length (min = 6, max = 12, mensaje = "La longitud del apodo es de 6 a 12 dígitos") Apodo de cadena privada; @Min (valor = 18, mensaje = "{validation.param.age}") private int Age; @Notblank @email (mensaje = "{validation.common.format.error}") Correo electrónico de cadena privada; @Notblank @Pattern (regexp = "^(?! [0-9]+$) (? @Notblank @Length (min = 3, max = 10, mensaje = "{validation.common.not.range}") String private String UserName; @Notblank @Pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $", mensaje = "El formato de número de teléfono móvil es incorrecto") teléfono de cadena privada; public usermodel () {} public Long getId () {return id; } public void setid (ID long) {this.id = id; } public String getNickName () {return Npokname; } public void setNickName (String Nickname) {this.nickName = Nickname; } public int getAge () {return Age; } public void setAge (int Age) {this.age = edad; } public String getEmail () {return email; } public void setEmail (correo electrónico de cadena) {this.email = correo electrónico; } public String getPassword () {return Password; } public void setPassword (String Password) {this.password = contraseña; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getPhone () {return Phone; } public void setphone (teléfono de cadena) {this.phone = phone; }}UserDetail:
paquete com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class UserDetail {private Long id; @NotBlank Private String Dirección; @NotBlank Private String Company; public userDetail () {} public Long getId () {return id; } public void setid (ID long) {this.id = id; } public String getAddress () {Dirección de retorno; } public void setAddress (dirección de cadena) {this.address = dirección; } public String getCompany () {Return Company; } public void setCompany (String Company) {this.comPany = Company; }}Prueba con ValidController
paquete com.mengdee.manage.controller; import javax.servlet.http.httpservletrequest; import javax.validation.valid; import og.springframework.stereotype.controller; import og.springfframework.validation.bindingResult; import; import org.springframework.validation.fielderror; import org.springframework.web.bind.annotation.requestMapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation com.mengdee.manage.validator.usermodel;@controler@requestmapping ("/válido") clase pública ValidController extiende Basecontroller {// http: // localhost: 8081/plataforma-springmvc-webapp/válido/test? Age=18&nickname=mengdee&id=1&[email protected]&password=root123&username=123&phone=183321758957 @RequestMapping @ResponseBody Object Validation (httpservletRequest solicitud, @Valid Usermodel usuario, bindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getfielderRor (); return super.ResponseJsonError (Fielderror); } return "ok"; } // Un método para verificar múltiples objetos al mismo tiempo requiere vincular múltiples resultados BindingResult. Aparece un @Valid, que corresponde a un BindingResult declarado más tarde. @RequestMapping (valor = "/test2", método = requestmethod.get) public @ResponseBody Object Validationmore (httpservletRequest request, @Valid usermodel user, bindingResult bindenResult, @Valid UserDetailDetail, BindingResUlTResult2) Fielderror = bindingResult.getFielderRor (); return super.ResponseJsonError (Fielderror); } if (bindingResult2.haserrors ()) {fielderror fielderror = bindingResult2.getFielderRor (); return super.ResponseJsonError (Fielderror); } return "ok"; }}Notas sobre el uso:
1. Para múltiples campos, el orden de verificación del sistema parece ser diferente del orden de la declaración de campo, como si fuera innecesario.
2. Para cada verificación, si no hay un atributo de mensaje, el sistema usará el valor predeterminado, como el correspondiente @notblank es equivalente a @notblank (mensaje = "no puede estar vacío")
3. Para los tipos de referencia como la cadena, debe usarlo junto con @notnull, @notempty o @notblank. Si no escribe una restricción vacía, después de las pruebas, este campo no participará en la verificación. Si usa @Pattern, @Length, @EMAIL, etc. solo, no se verificará. Debe usar una restricción vacía para limitarla.
@Min: Utilizado para tipos de datos básicos, como int, long, etc.
@Notnull: el valor de cualquier objeto no puede ser nulo
@Notempty: el elemento del objeto de colección no es 0, es decir, la colección no está vacía y también se puede usar para cadenas no nulas
@Notblank: solo se puede usar para una cadena, no nula, y la longitud en el trim () será mayor que 0
Tres: verificación grupal @Validated
1. El papel de la agrupación (escenario de uso):
Cada restricción de anotación de verificación tiene un atributo grupal, que se utiliza para especificar a qué grupo pertenece la restricción. De esta manera, se pueden configurar múltiples conjuntos de restricciones en el mismo campo. Al usarlo, solo necesita especificar qué conjunto de restricciones usar. Por ejemplo, al registrar a los usuarios y modificar la información del usuario, la ID debe estar vacía al registrarse, y la ID no debe estar vacía al modificar la información del usuario. Al usarlo, solo necesita asignar estas dos restricciones a diferentes grupos. Por ejemplo, al agregar, usar restricciones del Grupo A y usar las limitaciones del Grupo B al actualizar.
2. Un paquete es una interfaz vacía
GroupA y Groupb
paquete com.mengdee.manage.validator; public interfaz groupa {} paquete com.mengdee.manage.validator; public interfaz groupb {}Al usar @Validated ({groupa.class})
3. Secuencia de grupo @GroupSequence
Por defecto, la verificación de restricción de diferentes grupos está desordenada, y la secuencia del grupo se verifica en secuencia en el grupo antes y después del orden, como verificar primero las restricciones del grupo GroupA, y luego verificar las restricciones del grupo Groupb. Si hay requisitos para la orden de verificación de los grupos, por ejemplo, primero debe verificar el Grupo A y luego verificar el Grupo B, puede usar @GroupSequence para definir el orden de cada grupo
Use escenarios:
(1) La verificación de restricciones en el segundo grupo se basa en un estado estable para ejecutar, y el primer grupo verifica este estado estable.
(2) La verificación de un determinado grupo requiere mucho tiempo, y la tasa de uso de la CPU y la memoria es relativamente grande. La mejor opción es decir que dura la verificación. Por lo tanto, al realizar una verificación del grupo, todavía se necesita un método de verificación ordenado, lo que propone el concepto de secuencia de grupo.
Un grupo puede definirse como una secuencia de otros grupos, y debe cumplir con el orden especificado en la secuencia cuando se usa para verificación. Al usar la verificación de la secuencia del grupo, si la verificación del grupo antes de la secuencia falla, los grupos posteriores ya no serán validados.
Definir la secuencia de grupo utilizando anotaciones GroupSequence: groupab
paquete com.mengdee.manage.validator; import javax.validation.groupSequence; @GroupSequence ({groupa.class, groupb.class}) interfaz pública groupab {ValidationController
paquete com.mengdee.manage.controller; import javax.servlet.http.httpservletRequest; import org.springframework.stereotype.controller; import org.springframework.validation.bindingResult; import org.springframework.validation.fielderror; importar; org. com.mengdee.manage.validator.groupa; import com.mengdee.manage.validator.groupab; import com.mengdee.manage.validator.groupb; import com.mengdee.manage.validator.userEntity;@controlador@requestmapping ("/validado") Class de validación de clases Extends Bastrends Bastrends Bastrold especificado durante la verificación, de modo que solo se verifican las restricciones que contienen GroupA. Si no hay inclusión, no habrá verificación. For example, for phone, the group specified by @NotBlank, and @Pattern does not specify a group, then only one constraint is checked empty, and the mobile phone number format is not checked// http://localhost:8081/platform-springmvc-webapp/validated/groupA?password=root123&phone=123 @RequestMapping(value = "/groupA", method = RequestMethod.get) public @ResponseBody Object GroupA (HttpServletRequest solicitud, @Validated ({GroupA.Class}) UserTity User, BindingResult BindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getFielderror (); devolver esto.ResponseJsonError (Fielderror); } return "ok"; } // http: // localhost: 8081/plataforma-springmvc-webapp/validated/groupb? phone = 123 & contraseña = root123 & id = 1 @RequestMapping (valor = "/groupb", método = requestMethod.get) public @ResponseBody Object Object (HttpsEpperTRet Solicitud, @Validated ({Group.cleScLass}) BindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror filderror = bindingResult.getFielderRor (); devolver esto.ResponseJsonError (Fielderror); } return "ok"; } // groupab // http: // localhost: 8081/plataforma-springmvc-webapp/validated/groupab? phone=111&password=root123&nickname=123&[email protected] // @validated ({groupa.class, groupb.class}): la relación entre group y groupber o, solo en groupb o, como groupb o, como groupb o, como groupb o, como groupb o en el grupo o de groupb o, como la relación de groupber y el grupo o de group. base de datos. Mientras se cumpla una condición, se verificará la restricción. Use múltiples grupos al mismo tiempo para tener en cuenta que no hay ningún atributo en la secuencia entre múltiples grupos. No es para verificar primero el grupo A, y luego verificar el Grupo B. // porque las restricciones de ID están vacías y no vacías, el atributo se comenta primero @RequestMapping (valor = "/groupab", método = requestmethod.get) public @ResponseBody Object GroupAB (httPservletRequest Solicitud, @Validated ({{{{{{{{{{{{} Class de group.class ° Class Último Último. BindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror filderror = bindingResult.getFielderRor (); devolver esto.ResponseJsonError (Fielderror); } return "ok"; } // predeterminado // http: // localhost: 8081/plataforma-springmvc-webapp/predeterminado? correo electró[email protected]&age=18 // @validated Si los grupos no se especifican, verifique que no haya atributo de grupo (igual que la función @Valid en este momento). Si hay múltiples restricciones en un campo, no se debe especificar ningún grupo. Si el grupo especificado está parcialmente restringido y las restricciones parciales no especifican la restricción, entonces @RequestMapping (valor = "/default", método = requestmethod.get) no se verifica cuando se usa @Validated @ResponseBody Object lo defaultionGroup (httpServletRequest, @Validated UserEntity User, BindingResult) {if ((enlace (enlace). {Fielderror Fielderror = bindingResult.getFielderRor (); devolver esto.ResponseJsonError (Fielderror); } return "ok"; } //localhost:8081/platform-springmvc-webapp/validated/sequence?phone=123&password=root123&email=123&nickname=123 // For multiple constraints on a property, and multiple constraints are not all in the same group, the order of checking is checked according to the order defined by the GroupSequence @RequestMapping(value = "/sequence", method = RequestMethod.get) public @ResponseBody Object secuence (httpservletRequest request, @Valided ({Groupab.Class}) UserTity User, BindingResult BindingResult) {if (bindenResult.haserrors ()) {fielderror fielderror = bindingResult.getFielderror (); devolver esto.ResponseJsonError (Fielderror); } return "ok"; }}Cuatro: Anotación de validación de hibernación personalizada
Cuando la anotación proporcionada por la validación de Hibernate no puede cumplir con los requisitos, puede personalizar las limitaciones de verificación.
Pasos de restricción de anotación personalizada:
Crear anotación @phone
paquete com.mengdee.manage.validator; import java.lang.annotation.target; import javax.validation.Constraint; import javax.validation.payload; import static java.lang.annotation.anntype.annotation_type; import static java.lang.annotation.elementTyor; java.lang.annotation.ElementType.field; import static java.lang.annotation.ElementType.method; import static java.lang.annotation.ElementType.Parameter; import static java.lang.annotation.netentpolicy.Runtime; import java.lang.annotation. java.lang.annotation.retention; @Target ({Method, Field, Annotation_Type, Constructor, Parameter})@Retentent (Runtime)@documented@restricción (ValidatedBy = {PhonECNestrAint.class}) public @Interface Phone {String Message () "Error de formato de número de teléfono móvil predeterminado"; Cadena regexp () predeterminado "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $"; Clase <?> [] Grupos () predeterminado {}; Clase <? extiende la carga útil> [] Payload () predeterminado {}; @Target ({Method, Field, Annotation_Type, Constructor, Parameter}) @Retention (Runtime) @Documented public @Interface List {phone [] valor (); }}Cree una clase de verificación de restricción correspondiente a la anotación del número de teléfono móvil
paquete com.mengdee.manage.validator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class PhonEcaltainT implementa restricciones de Validator <teléfono, cadena> {String private REGEXP; @Override public void Initialize (Phone PhoneAnnotation) {this.regexp = PhoneanNotation.regexp (); } @Override public boolean isValid (valor de cadena, contexto de restrictValidatorContext) {if (value == null) {return true; // HV000028: Excepción inesperada durante la llamada ISVALID} if (value.matches (regexp)) {return true; } return false; }}Use anotación @phone en atributos
paquete com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class UserDetail {@notblank @phone Phone de cadena privada; public userDetail () {} public String getPhone () {return phone; } public void setphone (teléfono de cadena) {this.phone = phone; }}Notas de prueba
// http: // localhost: 8081/plataforma-springmvc-webapp/válido/test3? dirección = 123 & compañía = 456 & phone = 123 @RequestMapping (valor = "/test3", método = requestmethod.get) public @ResponseBody ObjectS ValidationCustomannotation (HTTPServletRequest, @Valid UserDetailDetElail, AtentationAil, ANTINTAIL bindingResult) {if (bindingResult.haserrors ()) {fielderror filderror = bindingResult.getFielderRor (); return super.ResponseJsonError (Fielderror); } return "ok"; }Descargue el código completo: http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(vevb.com).rar
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.
Artículo de referencia: