Este artigo apresenta brevemente como introduzir etapas de validação, como reduzir a quantidade de código por meio de validação personalizada e melhorar a produtividade. Menção especial: válido de atributos do tipo não primitivo, processamento de métodos GET, resolução unificada de mensagens de erro de validação.
A implementação real da validação neste artigo é confiada à validação de hiberna para processamento
Configuração básica
Pom apresenta dependências de mavenes
<!-Validação BEGIN-> <Ependency> <PuerpId> javax.validação </groupiD> <TRAFACTID> validação-api </artifactId> <Versão> 1.1.0.final </versão </dependency> <pendência> <voundid> org.hibernate </proupId> <strofactid> hibernate> )
Adicione a configuração de validação
Adicione a seguinte configuração ao spring-mvc-servlet.xml:
<mvc: anotação-driven validator = "validator"> <bean id = "validator"> <propriedade name = "provesterclass" value = "org.hibernate.validator.hibernateValidator"/> <nome da propriedade = "validationMessagesOrce" ref = "MessageSource" //xturce é um recurso I18n BEDENCE
Exception Handler personalizado
Personalize a mensagem de erro de validação e as informações retornadas ao chamador são mais amigáveis. A seguinte configuração é adicionada ao applicationContext.xml:
<!-Carregar o arquivo de recurso da mensagem i18n-> <bean id = "messageSource"> <propriedade name = "basenames"> <list> <Value> errorMsg </value> <Value> validation_error </value> </list> </propriedade> </bean> <bean id = "validationExceptionSolver"/>
Adicionado ao projeto ClassPath: Validation_error_zh_cn.properties Arquivo de recursos:
#the error msg for input validation#commonfield.can.not.be.null={field} cannot be empty field.can.not.be.empty={field} cannot be empty or empty string field.must.be.greater.than.min={field} cannot be less than {value}field.must.be.letter.than.max={field} cannot be greater than {value} ValidationExceptionResovler Implementação:
ValidationExceptionResovler.java
@Slf4jpublic class validationExceptionResovler estende abstracthandlerexceptionResolver {public validationExceptionResovler () {// Defina o pedido e execute this.setorder (0); } /** * lidera o caso em que um argumento anotado com {@code @valid} como * an {@link} ou {@link} argumento falha na validação. * <p> * Manipulador de exceção de validação personalizado * Obtenha a mensagem de erro de validação específica e monte a resposta CommonRespond e retorne ao chamador. * * @param solicitação atual solicitação http * @param Resposta atual HTTP Response * @param Handler O manipulador executado * @Return Um modelo e View vazio indicando que a exceção foi manuseada * @THOWSEXCECTIONS Potencialmente arremessado de respostas.sendError () */ @Response Protected ModelAndView manipul Solicitação, Resposta HttpServLetResponse, manipulador de objeto) lança IoException {list <BJecterRor> erros = bindingResult.getAlLERRORS (); StringBuffer errmsgbf = new StringBuffer (); para (erro objecterror: erros) {string Mass = error.getDefaultMessage (); errmsgbf.append (massagem); errmsgbf.append ("||"); } String errmsgString = errmsgbf.toString (); errmsgString = errmsgString.Length ()> 2? errmsgString.substring (0, errmsgString.length () - 2): errmsgString; log.error ("Validation falhou! {}", errmsgString); Mapa <string, object> map = new Treemap <string, object> (); map.put ("Sucesso", falso); map.put ("ErrorCode", "9999"); map.put ("errorMsg", errmsgString); ModelAndView MAV = new ModelAndView (); Mappingjackson2JSONVIEW View = new Mappingjackson2JSONVIEW (); view.setAttributesMap (mapa); Mav.SetView (View); retornar mav; } @Override ModelAndView protegido DORESOLVEEXCECTION (HTTPSERVLETREQUEST SOIT, HTTPSERVletResponse Resposta, manipulador de objetos, exceção ex) {bindingResult bindingResult = null; if (ex instância do MethodargumentNotValidexception) {bindingResult = ((MethodargumentNotValidexception) ex) .getBindingResult (); } else if (ex instância do bindException) {bindingResult = ((bindException) ex) .getBindingResult (); } else {// Outra exceção, ignore} if (bindingResult! = null) {tente {return handlemethodargumentNotValidexception (bindingResult, solicitação, resposta, manipulador); } catch (ioexception e) {log.error ("DoresolVeException:", e); }} retornar nulo; }} Adicionar @valid no controlador
@RequestMapping ("/Buy")@ResponseBodyPublic BaserSponse Buy (@RequestBody @Valid BuyflowerRequest Request) lança Exceção {// ......} Adicione a anotação de validação aos atributos que requerem validação no feijão da solicitação
@Setter@getterpublic classe BuyflowerRequest {@NotEmpty (message = "{name.can.not.be.null}") Nome da sequência privada;} Validação de objetos secundários
O método de escrita acima pode verificar apenas os atributos do tipo básico do BuyFlowerRequest, mas não há como validar os atributos dos atributos do objeto. Se você precisar validar os atributos do objeto secundário, precisará adicionar @valid e anotações de validação específicas ao objeto secundário e aos atributos do objeto secundário ao mesmo tempo.
O seguinte método de escrita:
@Setter @getterpublic classe BuyflowerRequest {@NotEmpty (Field = "BianName") Nome da String Private; @Min (field = "preço", valor = 1) private int preço; @NotNull Private List <Paytype> PayTypellist;} @setter @getterpublic classe Paytype {@valid @min (value = 1) private int paytype; @Valid @min (value = 1) private int payamount;} Reduzir ainda mais o número de codificações
Para reduzir a carga de trabalho de codificação, por meio de anotações de validação personalizadas, tente passar o nome arquivado da validação para o arquivo de recursos da mensagem de erro, evitando assim escrever modelos de mensagem diferentes para cada domínio.
Aqui está um exemplo do reescrito @NotNull:
1. Defina a anotação de validação, observe que o campo () é adicionado em comparação com a anotação nativa, que é usada para passar no nome arquivado que é validado.
Notnull.java
@Target ({elementType.method, elementType.field, elementType.annotation_type, elementType.Constructor, ElementType.parameter})@restrint (validadoBy = {NotNullValidator.class})@retention (retentionPolicy.Runtime) Publict) String message () padrão "{field.can.not.be.null}"; Classe <?> [] Grupos () padrão {}; Classe <? estende a carga de pagamento> [] Payload () padrão {};} 2. Definir validador, todos os validadores implementam a interface do restrintValidator:
NotnullValidator.java
classe pública NotNullValidator implementa o restrintValidator <notnull, object> {@Override public void Initialize (anotação notnull) {} @Override public boolean isValid (object str, restrintValidatorContextTrantValidatorContext) {retorna! = null; }} 3. Adicione a anotação de validação ao Arquivado, preste atenção à especificação do valor arquivado. Se a mensagem não tiver um requisito personalizado, você não precisará especificá -la. O componente de validação preencherá a mensagem padrão por si só.
BuyflowerRequest.java
@Setter @getterpublic classe BuyflowerRequest {@NotEmpty (Field = "BianName") Nome da String Private; @Min (Field = "Price", Value = 1) Private Int Price;} Nota: A anotação @NotNull já suporta verificação especial da lista. Para nós de tipo de lista, se list == null || list.size () == 0 retornará false e a validação falha. Atualmente, as anotações @NotNull, @NotEmpty, @Min, @Max foram personalizadas de acordo com essa idéia e podem ser encontradas no projeto de mercadorias.
Suporta solicitações de obtenção
Os exemplos acima são todos solicitações de postagem. @Requestbody pode resolver solicitações de postagem, mas eles não oferecem suporte a solicitações de obtenção. Leia a documentação e o código -fonte da Spring e constatou que @modelattribute pode resolver solicitações de feijões e validação de suporte. Para detalhes, você pode ler o código fonte da primavera: ModelAttributemethodProcessor.ResolVearGument ().
Exemplo de uso:
@RequestMapping (Value = "/Buy", Method = requestMethod.get) @ResponseBodyPublic Baserponse Detalhes (@Valid @Modelattribute DetailFlowerRequest Solicy) lança exceção {detalhefLowerResponse Response = new detalhefLowerResponse (); Response.SetName (request.getName ()); retorno resultadofactory.success (resposta, basesonsponse.class);} PENDÊNCIA
1. Expanda a validação de acordo com os cenários de negócios, como: formato de data, quantia, etc.
2. Validação de suporte de múltiplas relacionamentos de campo Verificação
Anexo: Código -chave da implementação da validação da primavera
@Requestbody
Classe de implementação: requestResponseBodyMethOdProcessor.java
Public Object ResolvearGument (parâmetro MethodParameter, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDatabinderFactory BinderFactory) lança a exceção {objeto arg = this.readWithMesSaGeconverters (WebEst, parâmetro, parâmetro.getGeNericParameterType (); Nome da sequência = Conventions.getVariableNameForParameter (parâmetro); WebDatabinder Binder = BindFactory.CreateBinder (WebRequest, Arg, Name); if (arg! = null) {this.validateIpplicable (Binder, parâmetro); if (Binder.getBindingResult (). HasErrors () && this.isbindexceptionRequired (Binder, Parâmetro)) {throw new MethodargumentNotValidexception (parâmetro, Binder.getBindingResult ()); }} mavContainer.addattribute (bindingResult.model_key_prefix + nome, Binder.getBindingResult ()); devolver arg;} @Modelattuite
Classe de implementação: ModelAttributemethodProcessor.java
Public Final Object ResolvearGument (parâmetro MethodParameter, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDatabinderFactory BinderFactory) lança exceção {Nome da String = ModelFactory.getNameForParameter (Parameter); Atributo do objeto = MavContainer.Containsattribute (nome)? MavContainer.getModel (). get (nome): this.creatAttribute (nome, parâmetro, bindFactory, webRequest); if (! MavContainer.isbindingDisabled (name)) {ModelAttribute Ann = (ModelAttribute) parameter.getParameterAnnotation (ModelAttribute.class); if (Ann! = null &&! Ann.Binding ()) {MavContainer.SetBindingDisabled (nome); }} Webdatabinder Binder = bindFactory.CreateBinder (WebRequest, atributo, nome); if (Binder.getTarget ()! = null) {if (! MavContainer.isbindingDisabled (name)) {this.bindRequestParameters (Binder, WebRequest); } this.ValidateIppLicable (Binder, Parâmetro); if (Binder.getBindingResult (). HasErrors () && this.isbindexceptionRequired (Binder, Parâmetro)) {Throw New BindException (Binder.getBindingResult ()); }} Mapa <string, object> bindingResultModel = Binder.getBindingResult (). GetModel (); MavContainer.removeattributes (BindingResultModel); MavContainer.addallattributes (BindingResultModel); Return Binder.ConvertifneCesary (Binder.gettarget (), Parameter.getParameterType (), Parâmetro);}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.