Por qué:
¿Por qué usar AOP para lograr la verificación?
respuesta:
Spring MVC tiene su propio mecanismo de verificación @Valid + BindingResult, pero esta implementación predeterminada debe recibir BindingResult en el método del controlador para realizar la verificación.
p.ej:
if (result.haserrors ()) {list <BJECTERROR> ALLERRORS = result.getAllerrors (); List <String> ErrorLists = new ArrayList <> (); para (objECTERROR objECTERROR: Allerrors) {ErrorLists.Add (objEcterRor.getDefaultMessage ()); }}Obtener listas de error. Si esto se implementa, cada método que requiere verificación debe llamarse repetidamente, incluso si está encapsulado.
Tal vez la declaración anterior no puede indicar la implementación del @Valid + BindingResult de Spring. Déjame darte una "castaña".
1. Chestnut (versión anterior)
1.1 Capa de interfaz (Idal)
Por ejemplo: la solicitud de publicación simple, @RequestBody recibe datos de solicitud, @Valid + BindingResult realiza una verificación
@ResponseBody @PostMapping ("Body") Public ResponseVo BodyPost (@RequestBody @Valid TestVo Body, BindingResult Result) {// Compruebe el error if (result.haserrors ()) {List <BJECTERROR> ALLERRORS = result.getallerrors (); List <String> lists = new ArrayList <> (); para (objECTERROR objECTERROR: Allerrors) {lists.add (objEcterror.getDefaultMessage ()); } return New ResponseVo (httpstatus.bad_request.value (), "parámetro vacío", listas); } return New ResponseVo (httpstatus.ok.value (), "BodyPost", nulo);}1.2 Contenido de verificación de entidad (VO)
@Valid + BindingResult tiene muchas anotaciones de verificación, ¡y puede encontrarlo tan pronto como lo toque en línea!
public class testvo {@getter @setter @min (valor = 0, mensaje = "parámetro de solicitud isstring no puede ser inferior a 0") privado entero esint; @Getter @setter @notblank (mensaje = "parámetro de solicitud isstring no puede estar vacío") cadena privada isstring;}1.3 Prueba de resultados
2. Verificación de AOP (versión actualizada)
Se puede ver que si se deben verificar múltiples cuerpos como el poste de la carrocería, entonces se debe reproducir un pedazo de código continuamente. Incluso si se cambia a un método reutilizable de clase principal, debe llamarse. Así que todavía siento que no es elegante después de pensar en ello. Entonces hay AOP para la verificación de la sección.
2.1 Capa de interfaz (Idal)
¡Sí! Usted lee bien, el código anterior se ha ido y no es necesario llamar al método compartido de la clase principal. Solo se hace una anotación: @paramvalid
@Paramvalid@respuestaBody@postmapping ("Body") Public ResponseVo BodyPost (@RequestBody @Valid TestVo Body, BindingResult Result) {return New ResponseVo ("BodyPost", NULL);}2.2 Anotación personalizada
Esta anotación también es una anotación de método simple.
@Target (elementType.method) @Retention (retentionPolicy.Runtime) public @Interface ParamValid {}2.3 Puntos clave! Implementación de aspecto
Explicación detallada de la sección:
@Before: use el método de anotación @Annotation (xx), este método se llamará cada vez que use la anotación deseada (@ParamValid).
Punto de unión: obtenga los parámetros del método a través del punto de unión para obtener el contenido verificado por bindingResult
Paquete de verificación de migración: migre la verificación original en el aspecto: ValidRequestParams
Resultados de verificación de respuesta:
@Aspecto@componentPublic Clase ParamValidaSpect {private static final logger log = loggerFactory.getLogger (paramValidaSpect.class); @Bebore ("@annotation (paramvalid)") public void ParamValid (unión de punto de unión, paramvalid paramvalid) {object [] paramobj = point.getArgs (); if (paramobj.length> 0) {if (paramObj [1] instanceOf bindingResult) {bindingResult dulte = (bindingResult) ParamObj [1]; ResponseVo errorMap = this.ValidRequestParams (resultado); if (errorMap! = null) {ServLetRequestatTributes res = (ServLetRequestatTributes) requestContexTholder.getRequestatTributes (); HttpservletResponse respuesta = res.getResponse (); respuesta.setcharacterEncoding ("UTF-8"); respuesta.setContentType (Mediatype.application_json_utf8_value); Response.setStatus (httpstatus.bad_request.value ()); OutputStream output = null; intente {outping = respuesta.getOutputStream (); errorMap.setCode (nulo); String Error = new Gson (). TJson (errorMap); LOG.Info ("Parámetro AOP irregular detectado" + error); output.write (error.getBytes ("UTF-8")); } catch (ioException e) {log.error (e.getMessage ()); } finalmente {try {if (output! = null) {output.close (); }} catch (ioException e) {log.error (e.getMessage ()); }}}}}}}} / *** Verificación* / Respuesta privada ValidRequestParams (BindingResult Result) {if (result.haserrors ()) {List <BJECTERROR> ALLERRORS = Result.getallerrors (); List <String> lists = new ArrayList <> (); para (objECTERROR objECTERROR: Allerrors) {lists.add (objEcterror.getDefaultMessage ()); } return New ResponseVo (httpstatus.bad_request.value (), "parámetro vacío", listas); } return null; }}2.4 Resultados de las pruebas
Después de leer los dos resultados anteriores, puede comparar las ventajas de usar Spring AOP con @Valid + BindingResult para la verificación:
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.