SpringMVC se usa en función de las anotaciones: manejo de excepciones

¡Acostúmbrate a escribir juntos! Este es el día 11 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

1. Analizador de manejo de excepciones integrado de Springmvc

En el desarrollo de un proyecto J2EE, ya sea la operación de la base de datos subyacente, el procesamiento de la capa empresarial o el procesamiento de la capa de control, es inevitable encontrar varias excepciones predecibles e impredecibles que deben manejarse. Cada proceso maneja las excepciones individualmente. El sistema tiene un alto grado de acoplamiento de código, y la carga de trabajo es grande y difícil de unificar, y la carga de trabajo de mantenimiento también es grande.

Entonces, ¿pueden desvincularse todos los tipos de manejo de excepciones de cada proceso de procesamiento, lo que no solo garantiza que las funciones de los procesos de procesamiento relacionados sean relativamente únicas, sino que también realiza el procesamiento y mantenimiento unificados de la información de excepción? La respuesta es sí. A continuación, se presentará la solución y el proceso de implementación del uso de Spring MVC para manejar las excepciones de manera uniforme.

SpringMVC tiene un mecanismo de manejo de excepciones muy poderoso.SpringMVC maneja las excepciones a través de HandlerExceptionResolver, incluido el mapeo de solicitudes, el enlace de datos y las excepciones que ocurren cuando se ejecuta el método de destino.

imagen.pngDespués de que el contenedor se inicie y entre en DispatcherServlet, procesará el HandlerExceptionResolver

Operación de inicialización de línea:

imagen.pngDe forma predeterminada, la clase de manejo de excepciones correspondiente se encontrará en DispatcherServlet.properties:

#默认的处理类
org.springframework.web.servlet.HandlerExceptionResolver=
#处理@ExceptionHandler
org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
#解析@ResponseStatus注释类型的异常
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
#按照不同类型分别对异常进行解析
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
        
        
        
复制代码

AbstractHandlerMethodExceptionResolver是ExceptionHandlerExcpetionResolver父类

SimpleMappingExceptionResolver: resuelve excepciones a través de la relación correspondiente entre la clase de excepción configurada y la vista

1-1 Use @ExceptionHandler para operar Exception

Para brindar al usuario una buena experiencia, no podemos mostrar directamente el mensaje de error al usuario al escribir el código, debemos tratarlo, como lo siguiente:

El método del controlador necesita pasar un parámetro:

imagen.png

El navegador directo no pasa el parámetro de nombre de la siguiente manera:

imagen.png

1-1-1 Manejo con @ExceptionHandler

imagen.png

El navegador de acceso puede ver la página siguiente

imagen.png 这样我们就可以对这个error.jsp进行一些处理,比如404 500 等一些错误的页面UI处理。

小结

我们在当前控制器中添加了@ExceptionHandler,也只能处理当前控制器的错误信息,如果需要处理所有控制器的错误信息,我们还需要进行统一错误信息。

二、统一异常处理

@ControllerAdvice 是Spring3.2提供的新注解,它是对Controller的增强,可对controller中被 @RequestMapping注解的方法加一些逻辑处理:

  1. 全局异常处理

  2. 全局数据绑定

  3. 全局数据预处理

@ExceptionHandler

加在Controller中 :只处理当前控制器的异常,优先级比全局高

加在ControllerAdvice中 :处理全局异常

2-1、使用@ControllerAdvice创建全局异常处理类

imagen.png 通过上图可以看到,目前有两个异常处理类,分别是控制器内部的还有使用@ControllerAdvice创建的全局异常处理类,那么如果这个时候发生异常是哪个异常来处理呢?下面来测试一下

imagen.png

特别说明一下,如果控制器内没有使用@ExceptionHandler注解的方法,会自动使用全局的错误异常方法

2-1-1、异常会被更精准的异常类处理

如果控制器内,没有定义异常处理方法,这个时候如果在全局异常处理类内定义了更加精准的异常处理方法,则会由更精准的异常处理方法处理。

imagen.png

2-1-2、异常处理优先级别

1、控制器异常 优先级最高 就近原则
2、全局异常中具体异常 如果控制器中没有定义异常 精准原则
3、全局异常 当异常没有满足以上两种情况,会交给全局异常处理

就近精准异常>就近异常>全局精准异常>全局异常

在实际项目中,一般只需要定义全局异常即可。

三、根据请求端请求方式自动返回异常处理信息

Lo anterior describe la forma de volver a la capa de vista para devolver información de excepción, pero ahora muchos proyectos usan el formato de devolución de Json, por lo que nuestro manejo de excepciones debe determinar automáticamente qué formato de datos debe devolverse.

3-1 Cómo juzgar el tipo de solicitud

3-1-1, se puede juzgar por el encabezado de la solicitud

solicitud json si Content-Type="application/json"

//-------------通过请求头判断是否包含application/json判断是否是json----------------begin
//如果不等于-1则代表为json请求
int accept = request.getHeader("Accept").indexOf("application/json");
//-------------通过请求头判断是否包含application/json判断是否是json----------------end
复制代码

3-1-2 A juzgar por anotaciones en clases y métodos

Si la anotación en la clase es @RestController o la anotación en el método es @ResponseBody, es una solicitud json

//---------通过注解判断是否是json-----------begin
//获取类上面的注解
RestController restControllerestController = handle.getClass().getAnnotation(RestController.class);
//获取方法上的注解
ResponseBody responseBody = handle.getMethod().getAnnotation(ResponseBody.class);
//---------通过注解判断是否是json-----------end
复制代码

imagen.pngLa imagen de arriba es el código de procesamiento.

prueba

1. Usa el método de solicitud de la página

imagen.png

2. Utilice la solicitud Json

imagen.png

Cuarto, manejo de excepciones 404

4-1 Primero configure la página de error en web.xml

<error-page>
    <error-code>404</error-code>
    <location>/errpage/404.html</location>
</error-page>
复制代码

4-2 Crear una página de error 404

imagen.png

4-3 Crear mapeo de recursos estáticos spring-mvc

imagen.png

4-4 Prueba

imagen.png

Supongo que te gusta

Origin juejin.im/post/7085212724740751373
Recomendado
Clasificación