Cómo realizar el retorno unificado de la interfaz y la captura unificada de excepciones en SpringBoot

Retorno unificado de la interfaz

Al desarrollar la interfaz de la empresa, se encuentra que el retorno de la interfaz de la capa del controlador debe incluirse en un resultado, como se muestra en la siguiente figura:

imagen

Ya sea que esté creando una interfaz o consultando una interfaz en el código gráfico, se necesita un Resultado para recibir aquí, echemos un vistazo a la estructura del Resultado:

Hay varios campos en este resultado:

"
  • código: código de estado

  • mensaje: información de estado

  • datos: carga los datos devueltos

  • excepción: datos anormales

"

Luego probamos la interfaz y vemos el estilo de devolución:

imagen

imagen

Llame a la interfaz, el formato de devolución es:

{
  "code": 200,
  "message": "SUCCESS",
  "data": {
      ...
  }
  "exception": xxx
}

Después de escribir, estaba pensando que cada interfaz debe estar envuelta con una capa de Resultado, lo que afecta la legibilidad de la interfaz. Como desarrollo, también es muy problemático envolver una capa de esta manera.

"

Entonces, ¿hay alguna manera de envolver automáticamente una capa de Resultado a través del marco y desarrollarla siempre que devuelva la entidad directamente en la capa Controlador?

"

Realmente existe un método que puede realizar el retorno unificado de la interfaz de la capa del controlador:

imagen

Como en el código anterior, usamos ResponseBodyAdvicepara interceptar los parámetros de retorno predeterminados del método de la capa del controlador. Para decirlo sin rodeos, es un interceptor. Depende principalmente del beforeBodyWrite()método En este método, si la devolución en el Controlador ya es un Resultado, el Resultado se devuelve directamente. Si no es así, use Result para envolverlo.

Echemos un vistazo al efecto:

imagen

Como en el código anterior, devolvemos la entidad directamente, echemos un vistazo al regreso de Swagger:

El formato devuelto por swagger es el formato de nuestro interceptor.

"

Aquí tengo otra pregunta. El retorno normal de la interfaz ha sido envuelto por Result. Si la interfaz arroja una excepción, ¿cómo puede devolver el mismo formato?

"

Captura de excepciones globales

Aquí necesitamos la captura de excepciones globales. Con respecto a la captura de excepciones globales, creo que muchos zapatos para niños saben:

Necesitamos escribir una clase de captura, agregarle @ControllerAdviceanotaciones y luego escribir métodos para manejar excepciones:

imagen

Agregamos @ResponseBodyanotaciones y @ExceptionHandleranotaciones, aquí value = Exception.class, significa que capturamos excepciones de tipo Exception. Podemos lanzar excepciones directamente:

imagen

También puedes lanzarlo así:

Probamos, si el código arroja una excepción, la interfaz devolverá:

El formato es el esperado.

Pero todavía hay un problema aquí, cada vez que necesito escribir una declaración if:

if(条件) {
   throw new RuntimeException("...");
}

Todavía es demasiado problemático escribir de esta manera, y todo se tira a la basura RuntimeException. Esto todavía es demasiado difícil.

Así que decidí personalizar una excepción comercial, encapsular algunos métodos de lanzamiento de excepciones y hacer lo que sea necesario.

Excepción comercial personalizada

imagen

Definimos una excepción comercial, que encapsula el código de estado de la excepción y los datos de información de la excepción.

Lanza la excepción con gracia

Luego escribimos una clase de juicio de excepción comercial:

imagen

Aquí solo se intercepta parte del código, en realidad solo hay dos métodos checkArgument()y checkNotNull(). ¿Para qué son buenos? Si desea hacer una verificación que no esté vacía, generalmente se hace de la siguiente manera:

if (updateEntity == null) {
    throw new RuntimeException("传入参数为null");
}

Pero ahora puedes hacer esto:

BusinessExceptionAssert.checkNotNull(updateEntity, "参数不能为null");

Lo que se lanza es mi excepción comercial personalizada.

¿Qué pasa si se trata de una verificación lógica general? El código anterior está escrito así:

if(!"1".equals(id)) {
   throw new RuntimeException(String.format("参数id【%s】只能为1",id));
}

Ahora puede haber implementaciones más elegantes:

BusinessExceptionAssert.checkArgument("1".equals(id), 500, "参数id【%s】只能为1",id);

Debido a que se lanza la excepción comercial, también podemos personalizar el código de excepción.

Código de prueba completo:

 @ApiOperation(value = "test-测试异常", httpMethod = "POST", notes = "测试代码,勿动")
 @PostMapping(value = "testBusinessException")
 public int testBusinessException(@RequestParam String id) {
     BusinessExceptionAssert.checkArgument("1".equals(id), 500, "参数id【%s】只能为1",id);
     return 1;
 }

Nuestros resultados de prueba:

imagen

En línea con las expectativas.

Este artículo está aquí, este artículo explica principalmente:

"
  • Cómo realizar el retorno unificado de la interfaz

  • Cómo personalizar las excepciones comerciales y ser detectado de manera uniforme

  • Cómo lanzar una excepción con gracia

"

Si hay alguna mejora, puede comunicarse activamente.

 

Supongo que te gusta

Origin blog.csdn.net/wujialv/article/details/111879692
Recomendado
Clasificación