码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • SpringMVC使用(二)


    1. 统一异常处理

    SpringMVC提供了统一处理Controller层抛出的异常的方法

    1.1 统一异常处理案例

    RestController的统一异常处理

    1. package com.lan.controller;
    2. import com.lan.exception.BusinessException;
    3. import com.lan.exception.SystemException;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.RestControllerAdvice;
    6. //注解@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
    7. @RestControllerAdvice
    8. public class ProjectExceptionAdvice {
    9. //注解@ExceptionHandler用于设置当前处理器类对应的异常类型
    10. @ExceptionHandler(SystemException.class) // 处理SystemException
    11. public Result doSystemException(SystemException ex){
    12. //记录日志
    13. //发送消息给运维
    14. //发送邮件给开发人员,ex对象发送给开发人员
    15. // ...
    16. return new Result(ex.getCode(),null,ex.getMessage());
    17. }
    18. @ExceptionHandler(BusinessException.class) // 处理BusinessException
    19. public Result doBusinessException(BusinessException ex){
    20. // ...
    21. return new Result(ex.getCode(),null,ex.getMessage());
    22. }
    23. //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    24. @ExceptionHandler(Exception.class) // 处理其它的Exception
    25. public Result doOtherException(Exception ex){
    26. // ...
    27. return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    28. }
    29. }

    1.2 常用注解

    注解作用作用目标
    @RestControllerAdvice为Controller类做增强,相当于@ControllerAdvice+@ResponseBody,@ExceptionHandler 方法默认带有 @ResponseBody 。

    类

    @ExceptionHandler设置指定类型异常的处理方案,Controller出现指定类型的异常后转入当前方法执行方法

    2. 统一结果封装

    通过@RestControllerAdvice增强Controller的同时,实现ResponseBodyAdvice接口可以统一封装RestController的返回结果。

    案例如下:

    1. package com.lan.controller;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.core.MethodParameter;
    4. import org.springframework.http.MediaType;
    5. import org.springframework.http.converter.HttpMessageConverter;
    6. import org.springframework.http.server.ServerHttpRequest;
    7. import org.springframework.http.server.ServerHttpResponse;
    8. import org.springframework.web.bind.annotation.RestControllerAdvice;
    9. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    10. import com.fasterxml.jackson.core.JsonProcessingException;
    11. import com.fasterxml.jackson.databind.ObjectMapper;
    12. @RestControllerAdvice
    13. public class ResponseHandler implements ResponseBodyAdvice {
    14. @Autowired
    15. private ObjectMapper objectMapper;
    16. @Override
    17. public boolean supports(MethodParameter returnType, Class> converterType) {
    18. // 类型不是Result时使用增强
    19. if(returnType.getParameterType() != Result.class) {
    20. return true;
    21. }
    22. return false;
    23. }
    24. // body为原返回对象
    25. @Override
    26. public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
    27. Class> selectedConverterType, ServerHttpRequest request,
    28. ServerHttpResponse response) {
    29. try {
    30. return objectMapper.writeValueAsString(new Result(0, body));
    31. } catch (JsonProcessingException e) {
    32. e.printStackTrace();
    33. }
    34. return body;
    35. }
    36. }
    37. 3. 拦截器interceptor

      SpringMVC中的拦截器(interceptor)是一种动态拦截控制层的机制,用来做控制层增强。

       3.1 拦截器Interceptor与过滤器Filter的区别

      归属不同:Filter属于Serlvet技术,Interceptor属于SpringMVC技术。

      拦截范围不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强。

      3.2 拦截器案例

      Servlet配置类

      1. package com.lan.config;
      2. import org.springframework.web.filter.CharacterEncodingFilter;
      3. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
      4. import javax.servlet.Filter;
      5. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
      6. protected Class[] getRootConfigClasses() {
      7. // return new Class[SpringConfig.class];
      8. return new Class[0];
      9. }
      10. protected Class[] getServletConfigClasses() {
      11. return new Class[]{SpringMvcConfig.class};
      12. }
      13. protected String[] getServletMappings() {
      14. return new String[]{"/"}; // 表示SpringMVC要处理的所有路径
      15. }
      16. //乱码处理的过滤器Filter
      17. @Override
      18. protected Filter[] getServletFilters() {
      19. CharacterEncodingFilter filter = new CharacterEncodingFilter();
      20. filter.setEncoding("UTF-8");
      21. return new Filter[]{filter};
      22. }
      23. }

      拦截器

      1. package com.lan.controller.interceptor;
      2. import org.springframework.stereotype.Component;
      3. import org.springframework.web.method.HandlerMethod;
      4. import org.springframework.web.servlet.HandlerInterceptor;
      5. import org.springframework.web.servlet.ModelAndView;
      6. import javax.servlet.http.HttpServletRequest;
      7. import javax.servlet.http.HttpServletResponse;
      8. @Component
      9. //定义拦截器类,实现HandlerInterceptor接口
      10. //注意当前类必须受Spring容器控制
      11. public class ProjectInterceptor implements HandlerInterceptor {
      12. @Override
      13. //原始方法调用前执行的内容
      14. //返回值类型可以拦截控制的执行,true放行,false终止
      15. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      16. String contentType = request.getHeader("Content-Type");
      17. HandlerMethod hm = (HandlerMethod)handler;
      18. System.out.println("preHandle..."+contentType);
      19. return true;
      20. }
      21. @Override
      22. //原始方法调用成功后执行的内容,原始方法调用抛出异常时不会执行
      23. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      24. System.out.println("postHandle...");
      25. }
      26. @Override
      27. //原始方法调用完成后执行的内容,无论原始方法调用是否有异常都会执行
      28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      29. System.out.println("afterCompletion...");
      30. }
      31. }

      拦截器配置类(注意:拦截器类要被SpringMVC容器扫描到):

      1. package com.lan.config;
      2. import com.itheima.controller.interceptor.ProjectInterceptor;
      3. import org.springframework.beans.factory.annotation.Autowired;
      4. import org.springframework.context.annotation.Configuration;
      5. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
      6. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
      7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
      8. @Configuration
      9. public class SpringMvcSupport extends WebMvcConfigurationSupport {
      10. @Autowired
      11. private ProjectInterceptor projectInterceptor;
      12. @Override
      13. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
      14. // 不需要SpringMVC处理的静态资源
      15. registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
      16. }
      17. @Override
      18. protected void addInterceptors(InterceptorRegistry registry) {
      19. //配置拦截器和拦截的所有路径
      20. registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
      21. // 添加多个添加拦截器
      22. // registry.addInterceptor(xxx).addPathPatterns("/xxx","/xxx/*");
      23. }
      24. }
    38. 相关阅读:
      YOLOv7改进策略:RIFormerBlock助力检测|CVPR2023 RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构
      登录之后右上角改变 进入登录状态
      linux上VirtualBox使用
      ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)离线部署
      &arr(&数组名)和arr(数组名)的区别|内附具体实例(新手易懂)
      计算机保研复习数据结构薄弱知识
      GORM使用指南一
      [TCP/IP] Linux 搭建服务器局域网
      普通人做自媒体怎么赚钱?
      智慧监狱解决方案-最新全套文件
    39. 原文地址:https://blog.csdn.net/werewolf2017/article/details/127908138
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号