Escena
Nuestro equipo ahora enfrenta el problema del acoplamiento de la interfaz de datos múltiples terminales. Para resolver este problema, hemos definido las especificaciones para el acoplamiento de la interfaz.
El front-end (Android, iOS, Web Front-end) y el back-end discutieron las especificaciones del formato de datos y determinaron el formato de datos de JSON:
{"código": "200", "datos": {"": ""}, "mensaje": "procesado con éxito"} {"código": "300", "datos": {"": ""}, "mensaje": "no este usuario"}El código representa el estado de procesamiento de solicitudes: 200 es procesamiento normal, 300 es el procesamiento de excepciones comerciales y 500 es el procesamiento de excepciones del sistema.
Los datos representan los datos devueltos por el fondo.
El mensaje de fondo del mensaje devolverá el motivo de error cuando sea normal o exitoso.
El problema está aquí
¿No sería muy problemático dejar que todos envuelvan el valor de retorno de cada vista JSON?
En este momento, se lanzará AOP. Podemos usar la idea de AOP para envolverla en una capa cuando la solicitud regrese a JSON antes de que se haya respondido al cliente.
Pasos de implementación
Habilitar AOP
< Expression = "org.springframework.stereotype.controller" /> < /context: component-scan> <!-Open AOP Annotation-> <AOP: SuppeJ-AutoProxy />
Crear una sección
/*** JSON Devuelve la cara Tangent* <p>* utilizada para procesar JSON Devuelve el resultado** @author zhuangjunxiang ([email protected])* @date el 28 de abril de abril de 2017* /@componente@aspecto@orden (2) Public class jsonreturnAspect { /*** Establecer el valor predeterminado por defecto* <P>* el componente@aspecto@orden (2) Public Class JsonreturnaSpect { /*** establecerá el valor predeterminado de la página* <P>* el componente@aspecto@orden (2) Public Class JsonreturNASPECT Archivo de configuración del sistema de forma predeterminada** @param PJP Tangent Point*/ @around (value = "@Annotation (org.springframework.web.bind.annotation.ResponseBody)") @order (1) Public Object WarP (PROGINING POTUNT PJP) Lanza el lanzamiento de lanzamiento {Object = PJP.Prower (); if (isreturnVoid (pjp)) {httpservletResponse respuesta = ((servletRequestattributes) requestContexTholder.getRequestatTributes ()) .getResponse (); if (isNeedWrap (PJP)) {Response.getWriter (). Write (JSONUTIL.TOJSON (Success ("Operation Success"))); } Lista de retorno; } Datos de retorno (lista); } / ** * es el paquete requerido * * @param pjp tangent punto * * @return true significa que no hay necesidad * / private boolean isNeedwrap (final de procedimientojoinpoint pjp) {método método = sightUtil.getMethod (pjp); return! Method.SannotationPresent (Void.Class); } / ** * si devuelve vacío * * @param pjp * @return true: el tipo de retorno es nulo, falso: el tipo de retorno no es void * / private boolean isReturnVoid (procedimientojoinpoint pjp) {método método = sightutil.getMethod (pjp); Clase <?> Returntype = método.getReturnType (); return "void" .equals (returntype.getName ()); } / *** Return Object después de la construcción exitosa* <p>* Cuando el mensaje está vacío, no se solicita ningún mensaje, y si no está vacío, se le solicita** @param Mensaje Mensaje de éxito* @return Json Object* / public static Map <String, Object> Success (Mensaje de cadena final) {Map <String, Object> Map = Maputil.map (); map.put ("código", statuscode.success.key ()); map.put ("mensaje", mensaje); map.put ("data", "); return map;} / *** Return Object después de la construcción exitosa* <p>* Cuando el mensaje está vacío, sin solicitado, y sin indicador vacío** @param Mensaje exitoso mensaje* @return json object* / public static map <string> data (data data (data de objeto final) {map <string, objeto> map = mapUtil.map (); map.put.put (" código ", statuscode.sCess.SuceS.SuceS.skey (Keyk.skey (Keyk.skey (Keykey). map.put ("Mensaje", Mensaje);
Analizarlo
@Component Esta anotación significa entregar este objeto al contenedor de resorte para instanciar.
@Aspect significa que esta es una clase faceta
@Around(value = "@annotation(org.springframework.web.bind.annotation.ResponseBody)")
Significa que todos los métodos con la anotación @ResponseBody son el punto medio de esta sección, en otras palabras, serán interceptados.
Aviso:
El parámetro de punto de procedimiento en el método WarP solo puede usar el punto de subclase de unión de unión, solo el punto de vista, solo por notificaciones circundantes.
Cada tipo de punto de conexión puede llamar al método proxy y obtener y cambiar el valor de retorno. De lo contrario, es para usar unión.
Caso 1: Suponga que la función en la clase del controlador no necesita ningún valor de retorno
Por ejemplo: cuando actualizo un objeto de entidad, solo necesito devolver el resultado de la actualización y está bien, y no hay necesidad de completar los datos.
Formato de datos devuelto:
{"código": "200", "datos": "", "mensaje": "procesado con éxito"}Ideas de implementación:
Obtenga el tipo de valor de retorno de esta función en la función de procesamiento de la clase de procesamiento de aspecto. Si es nulo, devuelve los datos en el formato especificado.
El ISreturnVoid anterior () es un juicio como este.
Solo necesita cambiar el valor de retorno de la función para anular:
@Requestmapping@ResponseBodyPublic Void Add (Long MatchID, Model Model) {SLXSIGNUPVIEWService.SetAdDinfo (MatchId, Model);}Caso 2: Suponga que el valor de retorno de la función en la clase del controlador no necesita estar envuelto
Por ejemplo:
Se especifica el valor de retorno de algunos complementos frontales y acoplamiento de terceros (pago).
Y descargar archivos, somos redundantes.
Ideas de implementación:
Personalizar la anotación para @void:
/*** Anotación vacía* <p>* Se usa para identificar el valor de retorno en la capa del controlador como es** @author wangsen ([email protected])* @date el 17 de agosto de 2017*/@target ({elementType.method})@retención(CretentPolicy.runtime))) @DocumentedpAcface {}
Agregue esta anotación al método de la capa del controlador
/*** Pago completado*/@void@ResponseBody@requestmappingPublic void payFinish () lanza ioexception {alipayviewservice.payfinish ();}Determine si esta función contiene esta anotación en esta clase de procesamiento de sección.
Entonces no se procesará y volverá como es.
El método ISNeedWrap () en la clase JSONRETREUNTURSPECT maneja este requisito.
Resumir
Lo anterior es un análisis de las ideas de implementación de JSON View de MVC de primavera personalizada que se le presentó. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!