Este artículo presenta brevemente cómo introducir pasos de validación, cómo reducir la cantidad de código a través de la validación personalizada y mejorar la productividad. Mención especial: Válido de los atributos de tipo no ejercicio, procesamiento de métodos GET, resolución unificada de mensajes de error de validación.
La implementación real de la validación en este artículo se confía a la validación de hibernación para el procesamiento
Configuración básica
POM presenta dependencias de Maven
< <Versión> 5.4.0.final </versión> </dependence> <!-End de validación->
Agregar configuración de validación
Agregue la siguiente configuración a Spring-MVC-Servlet.xml:
<mvc: annotation-diariven validator = "Validator"> <bean id = "Validator"> <Property name = "ProviderClass" value = "org.hibernate.validator.HiberNateValidator"/> <Property Name = "ValidationMessageSource" Ref = "Messagesurce" // MessageSource es un recurso de gestión de recursos, vea la aplicación de la aplicación.
ExceptionHandler personalizado
Personalice el mensaje de error de validación, y la información devuelta a la persona que llama es más amigable. La siguiente configuración se agrega a ApplicationContext.xml:
<
Agregado al proyecto classpath: validation_error_zh_cn.properties File de recursos:
#El Msg de error para la validación de entrada#Commonfield.can.not.be.null = {Field} no puede estar vacío Field.can.not.be.empty = {Field} no puede estar vacío o vacío String Field.must.Be.Greater.than.min = {Field} no puede ser menor que {valor} Field.must.be.tetter.than.max = {Field { ValidationExceptionResovler Implementación:
ValidationExceptionResovler.java
@SLF4JPublic ValidationExceptionResovler extiende AbstractThandLerExceptionResolver {public ValidationExceptionResovler () {// Establezca el orden y ejecute this.setorder (0); } /** * maneje el caso en el que un argumento anotado con {@code @Valid} como * an {@link} o {@link} argumento falla la validación. * <p> * Handler de excepciones de ValidationException personalizado * Obtenga el mensaje de error de validación específico y ensamble CommonResponse y regrese a la persona que llama. * * @param request current HTTP request * @param response current HTTP response * @param handler the executed handler * @return an empty ModelAndView indicating the exception was handled * @throws IOException potentially thrown from response.sendError() */ @ResponseBody protected ModelAndView handleMethodArgumentNotValidException(BindingResult bindingResult, HTTPServletRequest Solicitud, respuesta httpServletResponse, manejador de objetos) lanza ioexception {list <obJECTERROR> errores = bindingResult.getallerrors (); StringBuffer errmsgbf = new StringBuffer (); for (objEcterRor Error: errores) {String Mass = Error.getDefaultMessage (); errmsgbf.append (masaje); errmsgbf.append ("||"); } String ErrmSgString = errmsgbf.ToString (); errmsgString = errmsgString.length ()> 2? errmsgString.substring (0, errmsgString.length () - 2): errmsgString; log.error ("Validación fallida! {}", errmsgString); Map <string, object> map = new Treemap <String, Object> (); map.put ("éxito", falso); map.put ("ErrorCode", "9999"); map.put ("Errormsg", errmsgString); ModelandView mav = new ModelAndView (); MAPPINGJACKSON2JSONVIEW View = new MappingJackson2JsonView (); ver.SetAttributesMap (MAP); mav.setView (ver); regresar mav; } @Override ModelAndView DoresolveException (HttpServletRequest Solicitud, respuesta httpServletResponse, manejador de objetos, excepción ex) {bindingResult bindingResult = null; if (ex instanceOf metodArGumentNotValidException) {bindingResult = ((metodArGumentNotValidException) ex) .getBindingResult (); } else if (ex instanceOf bindException) {bindingResult = ((bindException) ex) .getBindingResult (); } else {// otra excepción, ignorar} if (bindingResult! = null) {try {return handlemethodargumentnotValidException (BindingResult, solicitud, respuesta, manejador); } catch (ioException e) {log.error ("doresolveException:", e); }} return null; }} Agregar @Valid en el controlador
@RequestMapping ("/buy")@ResponseBodyPublic BaseSponse Buy (@RequestBody @Valid BuyFlowerRequest) Lanza excepción {// ......} Agregar anotación de validación a los atributos que requieren validación en el bean de solicitud
@Setter@getterpublic clase buyFlowerRequest {@notempty (mensaje = "{name.can.not.be.null}") Nombre de cadena privada;} Validación de objetos secundarios
El método de escritura anterior solo puede verificar los atributos de tipo básico de BuyFlowerRequest, pero no hay forma de validar los atributos de los atributos del objeto. Si necesita validar los atributos del objeto secundario, debe agregar anotaciones de validación @Valid y específicas al objeto secundario y los atributos del objeto secundario al mismo tiempo.
El siguiente método de escritura:
@Setter @getterpublic clase buyFlowerRequest {@notempty (field = "bianname") nombre de cadena privada; @Min (field = "precio", valor = 1) privado int precio; @Notnull private List <SayType> payTyPeList;} @setter @getterpublic clase payType {@valid @min (valor = 1) private int payType; @Valid @min (valor = 1) privado int payamount;} Reducir aún más el número de codificaciones
Para reducir la carga de trabajo de codificación, a través de anotaciones de validación personalizadas, intente pasar el nombre de validación archivado al archivo de recursos del mensaje de error, evitando así escribir diferentes plantillas de mensajes para cada dominio.
Aquí hay un ejemplo del reescrito @notnull:
1. Defina la anotación de validación, tenga en cuenta que el campo () se agrega en comparación con la anotación nativa, que se utiliza para pasar el nombre archivado que se valida.
Nonull.java
@Target ({elementType.method, elementtype.field, elementtype.annotation_type, elementtype.constructor, elementtype.parameter})@restricter (validatedBy = {notNullValidator.class})@retención (retrivePolicy.runTime) public @interface nonlull {string cable () String Message () predeterminado "{field.can.not.be.null}"; Clase <?> [] Grupos () predeterminado {}; Clase <? extiende la carga útil> [] Payload () predeterminado {};} 2. Definir validador, todos los validadores implementan la interfaz RestraintValidator:
Nonullvalidator.java
La clase pública NotNullValidator implementa restrictValidator <NotNull, Object> {@Override public void Initialize (NotNull Annotation) {} @Override public boolean isValid (Object str, restrictValidatorContextValidatorContext) {return str! = null; }} 3. Agregue la anotación de validación a la archiva, preste atención a la especificación del valor archivado. Si el mensaje no tiene un requisito personalizado, no necesita especificarlo. El componente de validación completará el mensaje predeterminado por sí mismo.
BuyflowerRequest.java
@Setter @getterpublic clase buyFlowerRequest {@notempty (field = "bianname") nombre de cadena privada; @Min (field = "precio", valor = 1) privado int precio;} Nota: La anotación @notnull ya admite una verificación especial de la lista. Para nodos de tipo de lista, si list == null || list.size () == 0 devolverá falso y la validación falla. Actualmente, las anotaciones @notnull, @notempty, @min, @max se han personalizado de acuerdo con esta idea, y se pueden encontrar en el proyecto de bienes.
Admite obtener solicitudes
Los ejemplos anteriores son todas las solicitudes posteriores. @RequestBody puede resolver las solicitudes de publicación, pero no admiten las solicitudes GET. Lea la documentación y el código fuente de Spring y descubrió que @modelattribute puede resolver las solicitudes en los frijoles y la validación de soporte. Para obtener más detalles, puede leer el código fuente de Spring: ModelAtTributEMethodProcessor.resolvearGument ().
Ejemplo de uso:
@RequestMapping (valor = "/buy", método = requestmethod.get) @ResponseBodyPublic BaseSponse Detalle (@Valid @ModelAttribute DetalleFlowerRequest Solicitud) Lanza una excepción {DetellFlowResponse Respuesta = nuevo DetellFlowerResponse (); respuesta.setName (request.getName ()); return resultFactory.success (Respuesta, BaseResponse.Class);} HACER
1. Expanda la validación de acuerdo con los escenarios comerciales, como: formato de fecha, cantidad, etc.
2. Validación de soporte de verificación de relaciones de campo múltiples
Adjunto: código clave de implementación de validación de primavera
@Requestbody
Clase de implementación: requestResponseBodyMethodProcessor.java
Public Object ResolVearGument (MethodParameter Parameter, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDatabinderFactory BinderFactory) lanza la excepción {objeto arg = this.readwithMessageConverters (WebRequest, Parameter, Parameter.getGenerMetertype ()); Name de cadena = convenciones.getVariaBlenameForParameter (parámetro); WebDatabinder Binder = bindFactory.CreateBinder (WebRequest, Arg, nombre); if (arg! = null) {this.ValidateifApplicable (aglutinante, parámetro); if (binder.getBindingResult (). HasErrors () && this.isbindexceptionRequired (binder, parámetro)) {tirar nueva metodArgumentNotValidException (parámetro, binder.getBindingResult ()); }} mavContainer.Addattribute (bindingResult.model_key_prefix + name, binder.getBindingResult ()); devolver arg;} @Modelattuite
Clase de implementación: ModelAtTributEMethodProcessor.java
Public Final Object ResolVearGument (parámetro MethodParameter, ModelAndViewContainer MavContainer, nationWebRequest WebRequest, WebDatabinderFactory BinderFactory) lanza la excepción {String Name = ModelFactory.getNameForParameter (parámetro); Atributo de objeto = mavContainer.ContainsAttribute (nombre)? mavContainer.getModel (). get (nombre): this.createAtTribute (nombre, parámetro, bindFactory, webRequest); if (! mavContainer.IsBindingDisable (name)) {modelAttribute Ann = (modelAttribute) parámetro.getParameterAnnotation (modelAttribute.class); if (ann! = null &&! ann.binding ()) {mavcontainer.setBindingDisable (nombre); }} WebDatabinder Binder = bindFactory.CreateBinder (WebRequest, Attribute, Name); if (binder.getTarget ()! = null) {if (! mavcontainer.isbindingDisable (name)) {this.bindRequestParameters (Binder, WebRequest); } this.ValidateifApplicable (aglutinante, parámetro); if (binder.getBindingResult (). Haserrors () && this.isbindexceptionRequired (binder, parameter)) {tire nueva bindException (binder.getBindingResult ()); }} Map <string, object> bindingResultModel = binder.getBindingResult (). GetModel (); mavcontainer.removeattributes (bindingResultModel); mavcontainer.addallattributes (bindingResultModel); return binder.convertifNeceSary (binder.getTarget (), parameter.getParametertype (), parámetro);}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.