1: básicos do validador de hibernato
1. Introdução:
Ao usar as anotações anotações para adicionar restrições aos atributos de uma classe ou classe, verifique a legalidade do valor do atributo durante o tempo de execução.
2. Função:
A verificação dos parâmetros é muito importante no desenvolvimento da interface da API, porque o cliente pode passar menos parâmetros, ou o valor é ilegal, ou mesmo o valor do parâmetro é malicioso; portanto, a legalidade dos parâmetros transmitidos pelo cliente deve ser verificada. Entre eles, anotar as regras de verificação dos valores dos parâmetros para atributos por meio da anotação é uma maneira relativamente elegante.
3. Anotações de restrição comumente usadas
4. Obtenha um validador de hibernato pela primeira vez
Endereço da classe pública {@NotNull Private String Line1; Private String Line2; zip de string privado; Estado de String Private; @Length (max = 20) @NotNull Private String country; @Range (min = -2, max = 50, message = "piso fora do alcance") public int piso; // getter && setter}Dois: Integrar a verificação do Validador de Hibernato
Este exemplo é integrado com base na integração Springmvc+Fastjson (//www.vevb.com/article/139094.htm). Você pode primeiro olhar para este artigo (com código-fonte para download) e integrar o Validador de Hibernato com base neste artigo.
Etapas de integração:
1. Introduzir dependência do validador de hibernato em pom.xml
<Depencency> <GrupidId> org.hibernate </frugiD> <stifactId> hibernate-validador </stutifactId> <versão> 5.4.1.final </sipers> </dependency>
2. Configure o validador em [xxx] -servlet.xml: hibernateValidator
<!-<mvc: anotação-driven> Adicione o validador validador validador = "validator"-> <mvc: validator-driven de anotação = "validator"> <mvc: Message-Converters registring-defaults = "true"> <!-Configure Fastjson para substituir o suporte original de Jackson-> <Bean> <Nome "<! <Value> text/html; charset = utf-8 </value> <value> Application/json </value> </list> </property> <propriedade name = "Recursos"> <list> <talue> quotefieldNames </Value> </MVVE> WritemapnullValue </Valor> </List> </propriedade> </bean> <//MVC: <bean id = "validator"> <propriedades name = "proverclass" value = "org.hibernate.validator.hibernateValidator"/> <propriedade name = "validationMessagesource" ref = "messageSource"/> </bean> <bean id = "messageource"> <nome da propriedade "/" Basenames> <lista> <lista> <late> <value>classpath:org/hibernate/validator/ValidationMessages</value> </list> </property> <property name="useCodeAsDefaultMessage" value="false"/> <property name="defaultEncoding" value="UTF-8"/> <property name="cacheSeconds" value="60"/> </bean>
3. Defina o arquivo de mensagem de verificação Descrição Validation.Properties no local SRC/Main/Recursos/Configurações/Configurações
validation.common.not.null = Este campo não pode ser vazio validação.common.not.Range = comprimento Illegal validation.common.format.error = Erro de formato validação.param.age = idade abaixo de 18 anos de idade rep.error.unknown = erro desconhecido
4. Crie uma nova classe de entidade para testar
UserTity
pacote com.mengdee.manage.Validator; importar javax.validation.constraints.min; importar javax.validation.constraints.notnull; importar javax.validation.constraints.null; import javax.validation.constraints.pattern; importação.InBernate.validator.Vaints.Constraints.Constraints.Pattern; org.hibernate.validator.constraints.length; importar org.hibernate.validator.constraints.notblank; public class Userentity {@null (groups = {groupa.class}) @NotNull (groupb.b.b.class}) @GRUPRUST}) @NotNull (Groups = {GroupB.Class}), Groups @Group = 1, Message = "Id) @NotBlank (grupos = {groupA.class, groupb.class}) @pattern (regexp = "^(?! [0-9]+$) (?! [A-za-z]+$) [0-9a-za-z] {6,20} $", mensagem = "" Composição de 6-21 letters e números não pode ser pura, não é de 6,20 {não pode ser puro, que não é puro, que não pode ser puro, que não pode ser puro, que não pode ser puro, que não pode ser puro, que não pode ser puro, puro, que não pode ser puro, não é necessário. Groupb.class}) senha de sequência privada; @NotBlank (grupos = {groupA.class, groupb.class}) @pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $", mensagem = "o número de telefone móvel formato está incorreto") @NotBlank (grupos = {groupb.class}) @Length (min = 6, max = 12, message = "O comprimento do apelido é de 6 a 12 bits") apelido de string privada; @Min (value = 18, message = "{validation.param.age}") private Int Age; @NotBlank (GRUPOS = {groupA.class}) @email (message = "{validation.common.format.error}") email de sequência privada; @NotBlank @Length (min = 3, max = 10, message = "{validation.common.not.range}") private string userName; public userEntity () {} public long getId () {return id; } public void setId (longo id) {this.id = id; } public String getNickName () {return apelido; } public void setNickName (String apelido) {this.nickname = apelido; } public int getage () {Age de retorno; } public void setage (int Age) {this.age = Age; } public String getEmail () {retornar email; } public void setEmail (string email) {this.email = email; } public string getPassword () {return senha; } public void setPassword (string senha) {this.password = senha; } public string getUserName () {return userName; } public void setUserName (string userName) {this.username = nome de usuário; } public string getphone () {return telefone; } public void setPhone (string telefone) {this.phone = telefone; }}Usermodel
pacote com.mengdee.manage.Validator; importar javax.validation.constraints.min; importar javax.validation.constraints.pattern; importar org.hibernate.validator.constraints.mail; importação org.blanate.Validator.Constraints.Lengthen; @Min (value = 1, message = "O valor de identificação deve ser maior que 0") Private Long Id; @NotBlank @Length (min = 6, max = 12, message = "O comprimento do apelido é de 6 a 12 dígitos") apelido de string privada; @Min (value = 18, message = "{validation.param.age}") private Int Age; @NotBlank @email (message = "{validation.common.format.error}") private string email; @NotBlank @pattern (regexp = "^(?! [0-9]+$) (?! [A-za-z]+$) [0-9a-za-z] {6,20} $", message = "Composição de 6-21 letras e números, não é possível números pura ou inglês puro") private string senha; @NotBlank @Length (min = 3, max = 10, message = "{validation.common.not.range}") private string userName; @NotBlank @pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $", message = "O formato do número de telefone celular está incorreto") String String Phone; public userModel () {} public long getId () {return id; } public void setId (longo id) {this.id = id; } public String getNickName () {return apelido; } public void setNickName (String apelido) {this.nickname = apelido; } public int getage () {Age de retorno; } public void setage (int Age) {this.age = Age; } public String getEmail () {retornar email; } public void setEmail (string email) {this.email = email; } public string getPassword () {return senha; } public void setPassword (string senha) {this.password = senha; } public string getUserName () {return userName; } public void setUserName (string userName) {this.username = nome de usuário; } public string getphone () {return telefone; } public void setPhone (string telefone) {this.phone = telefone; }}UserDetail:
pacote com.mengdee.manage.validator; importar org.hibernate.validator.constraints.NotBlank; public classe userDetail {private longo id; @NotBlank Private String Endereço; @NotBlank Private String Company; public userDetail () {} public long getId () {return id; } public void setId (longo id) {this.id = id; } public string getAddress () {retornar endereço; } public void setAddress (endereço da string) {this.address = endereço; } public String getCompany () {Return Company; } public void setCompany (String Company) {this.company = Company; }}Teste com ValidController
pacote com.mengdee.manage.controller; importar javax.servlet.http.httpServletRequest; importar javax.validation.valid; importação org.springframework.tereotype.controller; importsrg.PringFrameing.Validation.BindingRySult; ImportGroller; ImportGring.PortSl; org.springframework.web.bind.annotation.requestmapping; importar org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.Responsoperbody; import.MenGdee.ManageDe. O ValidController estende Basecontroller {// http: // localhost: 8081/plataform-springmvc-webapp/válido/test? Age=18&nickname=mengDee&id=1&[email protected]&password=root123&[email protected]&password=root123&[email protected]&password=root123&[email protected]. "/teste", método = requestmethod.get) public @ResponseBody Objetos Validação (httpServletRequest Solicitação, Usermodel UserModel, Usermodel, BindingResult BindingResult) {if (bindingResult.haserrors ()) {fielderror) retornar super.ResponsejsonError (fielderror); } retornar "OK"; } // Um método para verificar vários objetos ao mesmo tempo requer vincular múltiplos resultados BindingResult. Um @valid aparece, que corresponde a um BindingResult declarado posteriormente. @RequestMapping (value = "/test2", método = requestMethod.get) public @ResponseBody Objeto ValidaçãoMore (httpServletRequest Solicy, @Valid UserModel User, BindingResult BindingResult, @Valid userDetail userDetail, BindingResultsultsultsultsult2) {IFEdReSUrSeRes (BentringSultsultsult) {If) {) finteDRESURSURSURSURSURSURSURSURS (@VALID UserDetail userDeTail, LizrSultingSultsultsult2) {se fielderror = bindingResult.getfielderror (); retornar super.ResponsejsonError (fielderror); } if (bindingResult2.haserrors ()) {fielderror fielderror = bindingResult2.getfielderror (); retornar super.ResponsejsonError (fielderror); } retornar "OK"; }}Notas sobre uso:
1. Para vários campos, a ordem de verificação do sistema parece ser diferente da declaração da ordem de campo, como se fosse desnecessária.
2. Para cada verificação, se não houver atributo de mensagem, o sistema usará o padrão, como o @NotBlank correspondente é equivalente a @NotBlank (message = "não pode estar vazio")
3. Para tipos de referência como String, você deve usá -la em conjunto com @NotNull, @NotEmpty ou @NotBlank. Se você não escrever uma restrição vazia, após o teste, esse campo não participará da verificação. Se você usar @Pattern, @Length, @Email, etc. sozinho, ele não será verificado. Você deve usar uma restrição vazia para limitá -la.
@Min: usado para tipos de dados básicos, como int, long, etc.
@NotNull: o valor de qualquer objeto não pode ser nulo
@NotEmpty: O elemento do objeto de coleção não é 0, ou seja, a coleção não está vazia e também pode ser usada para strings não nulos
@NotBlank: ele só pode ser usado para string não nulo, e o comprimento na parte de cordas () será maior que 0
Três: Verificação em grupo @validada
1. O papel do agrupamento (cenário de uso):
Cada restrição de anotação de verificação possui um atributo de grupo, que é usado para especificar a qual grupo a restrição pertence. Dessa forma, vários conjuntos de restrições podem ser configurados no mesmo campo. Ao usá -lo, você só precisa especificar qual conjunto de restrições usar. Por exemplo, ao registrar os usuários e modificar as informações do usuário, o ID deve estar vazio ao se registrar e o ID não deve estar vazio ao modificar as informações do usuário. Ao usá -lo, você só precisa atribuir essas duas restrições a grupos diferentes. Por exemplo, ao adicionar, usando as restrições do Grupo A e usando as restrições do Grupo B ao atualizar.
2. Um pacote é uma interface vazia
Grupo e grupo
pacote com.mengdee.manage.validator; interface pública Groupa {} pacote com.mengdee.manage.validator; public interface Groupb {}Ao usar @Validated ({groupA.class})
3.
Por padrão, a verificação de restrições de diferentes grupos não é ordenada e a sequência do grupo é verificada em sequência no grupo antes e depois da ordem, como verificando primeiro as restrições do grupo do grupo e, em seguida, verificando as restrições do grupo de grupob. Se houver requisitos para a ordem de verificação dos grupos, por exemplo, você deverá primeiro verificar o Grupo A e, em seguida
Use cenários:
(1) A verificação da restrição no segundo grupo depende de um estado estável para ser executado, e esse estado estável é verificado pelo primeiro grupo.
(2) A verificação de um determinado grupo é demorado, e a taxa de uso da CPU e da memória é relativamente grande. A melhor opção é colocá -lo por último para verificação. Portanto, ao executar a verificação do grupo, ainda é necessário um método de verificação ordenado, que propõe o conceito de sequência de grupos.
Um grupo pode ser definido como uma sequência de outros grupos e deve cumprir a ordem especificada na sequência quando usada para verificação. Ao usar a verificação da sequência do grupo, se a verificação do grupo antes da sequência falhar, os grupos subsequentes não serão mais validados.
Definir sequência de grupo usando o grupo de anotação: Groupab
pacote com.mengdee.manage.validator; importar javax.validation.groupsequence; @GroupSequence ({groupA.class, grupob.class}) public interface Groupab {ValidationController
pacote com.mengdee.manage.controller; importar javax.servlet.http.httpServletRequest; importar org.springframework.tereotype.controller; importação org.springframework.validation.bindingRrielsult; importação; org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.mengdee.manage.validator.groupa; importar com.mengdee.manage.validator.groupab; importar com.mengdee.manage.validator.groupb; import com.mengDee.manage.validator.userentity;@controller@requestMapping ("/validado") Vididaltion.Taltation.Talidator.UserTity; Verificação, para que apenas as restrições contendo o grupo sejam verificadas. Se não houver inclusão, não haverá verificação. Por exemplo, para o telefone, o grupo especificado por @NotBlank e @pattern não especifica um grupo, então apenas uma restrição é verificada vazia e o formato do número de telefone celular não é verificado // http: // localhost: 8081/plataform-springmvc-webapp/validado/groupa? RequestMethod.get) public @ResponseBody Object Groupa (httpServletRequest Request, @Validated ({groupA.class}) Usuário de Usuário, BindingResult BindingResult) {if (bindingResult.haserrors ()) {fielderorror fiElderrer =; retornar este.ResponsejsonError (fielderror); } retornar "OK"; } // http: // localhost: 8081/plataform-springmvc-webapp/validado/groupb? telefone = 123 & senha = root123 & id = 1 @requestMapping (value ("/groupB", método = solicitaçãoMethod.get) @ResponsoPonseed Groupb (HTTSTENTRETRETRETRESTENTETRESTETRITE = SOBERTMETHOD.GET) BindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getfielderror (); retornar este.ResponsejsonError (fielderror); } retornar "OK"; } // groupab // http: // localhost: 8081/plataform-springmvc-webapp/validado/groupab? Phone=111&password=root123&nickname=123&[email protected] // @validado ({groupa.class é grupo, groupb.cls banco de dados. Enquanto uma condição for atendida, a restrição será verificada. Use vários grupos ao mesmo tempo para observar que não há atributo em sequência entre vários grupos. Não é para verificar o grupo um primeiro e depois verificar o grupo B. // Como as restrições de ID estão vazias e não são verificadas, o atributo é comentado primeiro @RequestMapping (value = "/groupAB", métodos = requestMethod.get) public @ResponseBody Group (HttTsTeStleRerPend.Bestity. BindingResult bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getfielderror (); retornar este.ResponsejsonError (fielderror); } retornar "OK"; } // Padrão // http: // localhost: 8081/plataform-springmvc-webapp/padrão? [email protected]&age=18 // @validado Se os grupos não forem especificados, verifique se não há atributo de grupo (o mesmo da função @Valid nessa época). Se houver várias restrições em um campo, nenhum grupo deve ser especificado. If the specified group is partially constrained and partial constraints do not specify the constraint, then @RequestMapping(value = "/default", method = RequestMethod.GET) is not checked when using @Validated @ResponseBody Object defaultGroup(HttpServletRequest request, @Validated UserEntity user, BindingResult bindingResult){ if (bindingResult.hasErrors()) {Fielderror fielderror = bindingResult.getfielderror (); retornar este.ResponsejsonError (fielderror); } retornar "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 Objetos sequência (httpServletRequest Request, @Validated ({groupab.class}) Usuário de Usuário, BindingResult BindingResult) {if (bindingResult.haserrors ()) {fielderorror fielderrer =; retornar este.ResponsejsonError (fielderror); } retornar "OK"; }}Quatro: anotação de validação de hibernação personalizada
Quando a anotação fornecida pela Validação de Hibernato não pode atender aos requisitos, você pode personalizar as restrições de verificação.
Etapas de restrição de anotação personalizadas:
Crie anotação @phone
pacote com.mengdee.manage.validator; importar java.lang.annotation.target; importar javax.validation.constraint; importar javax.validation.payload; import static java.lang.annotation.ElementType.annotation_typen; java.lang.annotation.ElementType.Field; importar java estático.lang.annotation.ElementType.Method; importar java estático.lang.annotation.ElementType.Parameter; importar java.lang.annotation.ReToutionPolicy.Raguameter; java.lang.annotation.retEntion; @target ({método, campo, anotação_type, construtor, parâmetro})@retention (runtime)@documed@restrint (validadoby = {phoneconstraint.class}) public @interface telefone {string message () "default" telefone do telefone Error "; String regexp () padrão "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $"; Classe <?> [] Grupos () padrão {}; Classe <? estende a carga de pagamento> [] Payload () padrão {}; @Target ({método, campo, anotação_type, construtor, parâmetro}) @retention (runtime) @documented public @interface list {Phone [] value (); }}Crie uma classe de verificação de restrição correspondente à anotação do número de telefone celular
pacote com.mengdee.manage.Validator; importar javax.validation.constraintValidator; importar javax.validation.constraIntValidatorContext; classe pública PhoneConstraint implementa restrintValidator <telefone, string> {private string regexp; @Override public void Initialize (PhoneanNotation) {this.Regexp = PhoneanNotation.Regexp (); } @Override public boolean iSValid (valor da string, restrintValidatorContext context) {if (value == null) {return true; // hv000028: exceção inesperada durante a chamada ISValid} if (value.matches (regexp)) {return true; } retornar false; }}Use anotação @phone em atributos
pacote com.mengdee.manage.validator; importar org.hibernate.validator.constraints.NotBlank; public class UserDetail {@NotBlank @Phone Private String Phone; public userDetail () {} public string getphone () {return telefone; } public void setPhone (string telefone) {this.phone = telefone; }}Notas de teste
// http: // localhost: 8081/plataform-springmvc-webapp/válida/test3? bindingResult) {if (bindingResult.haserrors ()) {fielderror fielderror = bindingResult.getfielderror (); retornar super.ResponsejsonError (fielderror); } retornar "OK"; }Faça o download do código completo: http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(vevb.com).rar
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.
Artigo de referência: