Java研学-SpringBoot(五)

七 统一异常处理

1 框架自带方式

  Spring Boot 默认会把所有错误都交给 BasicErrorController 类完成处理,错误的视图导向到 classpath:/static/error/ 和 classpath:/templates/error/路径上,HTTP 状态码就是默认视图的名称。如:

// 出现 404 错误 ->
classpath:/static/error/404.html 
// 出现 5xx 错误 
classpath:/static/error/5xx.html

  于 resources/static 目录下创建error目录,导入404.html文件后,当出现404错误时,就会展示该页面

<!DOCTYPE html>  
<html lang="zh">  
<head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>404 - 页面未找到</title>  <style>  body {  font-family: Arial, sans-serif;  background-color: #f0f0f0;  display: flex;  justify-content: center;  align-items: center;  height: 100vh;  margin: 0;  }  .container {  text-align: center;  background-color: #fff;  padding: 30px;  border-radius: 10px;  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);  }  h1 {  color: #333;  font-size: 24px;  }  p {  color: #666;  font-size: 16px;  margin-top: 10px;  }  a {  color: #007bff;  text-decoration: none;  font-weight: bold;  }  </style>  
</head>  
<body>  <div class="container">  <h1>404 - 页面未找到</h1>  <p>很抱歉,您正在寻找的页面不存在或已被移除。</p>  <p>请检查您输入的网址是否正确,或者返回<a href="/">首页</a>继续浏览。</p>  </div>  
</body>  
</html>

2 控制器增强器

  针对不同的错误类型,给用户的提示也要随之变化,请求的不同,返回的也应该不同(404没找到的话是返回一个固定的页面,500对于Ajax请求,返回的应该是一个json字符串,对于form表单的请求,返回的就应该是一个页面)
  于 src/main/java/cn/tj/play_boot/web/advice 目录下创建 ExceptionControllerAdvice 统一异常处理类(需要贴上异常处理类注解 @ControllerAdvice),不同的异常返回的异常信息也不同,可创建多个异常处理方法进行捕获,哪一个方法的异常类型更详细,就由那个方法进行捕获(运行时异常,算术异常)

@ControllerAdvice
public class ExceptionControllerAdvice {//Controller 中写的是处理器方法 ControllerAdvice 中写的是异常处理方法//他与Controller 相同点//返回值//void 会定义形参 HttpServletResponse 类型 自定义响应内容 //String 处理方法可以定义个Model 形参,响应HTML 格式//自定义类型 响应 JSON 格式数据,方法上要贴@ResponseBody//ModelAndView 响应 HTML//不同点//这个处理异常的方法不贴@RequestMapping,贴的是@ExceptionHandler 注解,指定针对什么类型的异常// 形参中可以指定异常类// 指定异常是因为这样就可以根据不同的异常类型来响应不同的内容。// 在请求访问经过控制器,业务层,Mapper 对象,整个调用的过程中若出现了异常且没有被处理(try catch)。这些异常都统一交给这个方法来处理@ExceptionHandler(RuntimeException.class)public String handlerException(Model model, RuntimeException e) {e.printStackTrace();// 将异常信息显示到页面上model.addAttribute("errorMsg", e.getMessage());// 对应的templates中应该有一个error页面return "error";}
}
<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>500异常页面</title>
</head>
<body><p th:text="${errorMsg}"></p>
</body>
</html>

八 拦截器

1 介绍

  在传统的 XML 方式中,需要在 <mvc:interceptors> 标签中去注册自定义的拦截器。
  在 Spring Boot 中,提供了 WebMvcConfigurer 配置接口,是使用 JavaConfig 配置 Spring MVC 的标准,如果对 Spring MVC 做配置,则需要自定义配置类实现该接口,若是需要注册拦截器,则实现接口中的 addInterceptors 方法即可

2 编辑拦截器

  于 src/main/java/cn/tj/play_boot/web/interceptor 创建 HelloInterceptor 拦截器

@Component
public class HelloInterceptor implements HandlerInterceptor {
/*请求进入controller之前拦截 true为放行*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器来喽");return true;}
}

3 注册

  原来编辑拦截器后需要在xml中进行注册,但在 JavaConfig 中需要自定义配置类(贴 @Configuration 注解),继承WebMvcConfigurer 接口,重写对应的方法(大改),于src/main/java/cn/tj/play_boot/config/ 目录创建 MvcJavaConfig ,重写添加拦截器方法(addInterceptors)

@Configuration
public class MvcJavaConfig implements WebMvcConfigurer {@Autowiredprivate HelloInterceptor helloInterceptor;// 拦截器可以设置多个 其执行顺序就是我们的书写顺序// 设置拦截器的拦截规则@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 所有需要注册的拦截器都封装到了 InterceptorRegistry 中registry.addInterceptor(helloInterceptor)//注册自定义的拦截器对象.addPathPatterns("/**")//设置需要拦截的路径(全部路径).excludePathPatterns("/static/*","/user");//设置不需要拦截的路径(可设置多个路径)// 可编辑多个拦截器/*registry.addInterceptor(helloInterceptor2)//注册自定义的拦截器对象.addPathPatterns("/**")//设置需要拦截的路径(全部路径).excludePathPatterns("/static/*","/user");//设置不需要拦截的路径(可设置多个路径)*/}
}

九 日志

1 作用

  日志框架可以把日志的输出和代码分离,能够很方便的定义日志的输出环境,控制台,文件,数据库以及日志的输出格式和输出级别。配置文件设置logging.level.cn.tj.mapper=trace会导致服务器日志磁盘占用越来越多

2 Spring Boot 中的日志

  Spring Boot 默认开启日志,其默认的日志格式为:时间 日志级别 线程ID 线程名称 日志类 日志说明。
  Spring Boot 的日志分为:系统日志和应用日志。日志级别,级别越高,输出的内容越少,如果设置的级别为 info,则 debug 以及 trace 级别的都无法显示,日志级别由低到高 trace < debug < info < warn < error。
  Spring Boot 默认选择 Logback 作为日志框架

3 输出日志 – 两种方式

  在定义静态Logger对象时,你需要传入当前类的.class属性作为参数给LoggerFactory.getLogger()方法。但是,不能直接写当前类.class,因为当前类并不是一个有效的Java语法。需要使用this.getClass()或者类名.class来获取当前类的Class对象。

// 类中定义一个静态 Logger 对象,传入当前类后可查看该类的日志
private static final Logger log = LoggerFactory.getLogger(当前类.class);

  @Slf4j 注解会自动为 PermissionServiceImpl 类生成一个静态的 final Logger 对象,名为 log,这个对象是通过 SLF4J 的 LoggerFactory 初始化的。这样就不必手动编写和初始化 Logger 对象了。

// 使用 Lombok 提供的 @Slf4j 注解简化代码,和方式一的作用相同
@Slf4j
@Service
public class DepartmentServiceImpl implements DepartmentService {}

  日志的输出方法,springboot默认的日志级别为info,所以低级别的 trace 和 debug 直接调用log.trace(…)和log.debug(…)是看不到的,需要在application.properties文件中进行小改(logging.level.root=trace)后才能看到所有日志信息

// 在需要输出日志的地方使用日志的输出方法,
log.info(...);
log.error(...);
...
// 输出日志中变量可以使用 {} 作为占位符,id中的数据会替换{}
log.info("删除id为{}的数据", id);

4 Logback 配置文件

  resources 目录下创建 logback-spring.xml 文件,Logback 框架默认会自动加载 classpath:logback.xml,在 Spring Boot 中使用时,会额外的支持自动加载classpath:logback-spring.xml(模板文件直接复制即可),其中由 appender 标签决定将日志输出到哪里,通过 < appender-ref ref=“STDOUT”/> 决定选用那个 appender 标签

<?xml version="1.0" encoding="UTF-8"?>
<!--scan:开启日志框架的热部署,默认值 true 表示开启scanPeriod:热部署的频率,默认值 60 seconddebug:设置输出框架内部的日志,默认值 false--><configuration scan="true" scanPeriod="60 second" debug="false"><property name="appName" value="springboot demo"/><contextName>${appName}</contextName><!-- appender:日志输出对象,配置不同的类拥有不同的功能ch.qos.logback.core.ConsoleAppender:日志输出到控制台        --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd-HH:mm:ss} %level [%thread]-%logger{35} >> %msg %n</pattern></encoder>  </appender><!--ch.qos.logback.core.FileAppender:日志输出到文件中--><appender name="fileAppender" class="ch.qos.logback.core.FileAppender"><!--日志格式--><encoder><pattern>%-4relative [%thread] %level %logger{35} - %msg %n</pattern></encoder><!--是否追加,指同一个文件不断续写重启不刷新,设置为false后重启程序日志文件会刷新,一般设为true--><append>true</append><!--要输出的文件名,默认会生成到当前工程目录下--><file>mylog.log</file></appender><!--root 是项目通用的 logger,一般情况下都是使用 root 配置的日志输出level:按照级别输出日志,日志级别,级别越高,输出的内容越少可以同时支持两种日志输出方式:控制台和文件--><root level="info"><appender-ref ref="STDOUT"/><appender-ref ref="fileAppender"/></root><!-- 自定义的 logger,用于专门输出特定包中打印的日志<logger name="cn.tj.crm.mapper" level="trace"></logger>-->
</configuration>

十 banner

1 修改 banner

  在 resources 目录中放入 banner.txt 文件,即可替换默认的 banner。
  可以通过在线banner制作自定义的 banner

2 关闭 banner – application.properties 文件

# 关闭 banner
spring.main.banner-mode=off 

十一 热部署

1 导入依赖

  Spring Boot 重启是 reload 重启,通过监控 classpath 的变化,如果 classpath 中的文件发生变化,即触发重启。Spring Boot 通过两个 classpath 来完成 reload,一个 basic classloader 中加载不变的类(jar 包中的类),一个 restart classloader 中加载 classpath 中的类(自己写的类),重启的时候,restart classloader 中的类丢弃并重新加载。
  JRebel 可以实现热部署,Spring Boot 也可以通过提供的 spring-boot-devtools 包来完成 Springboot 应用热部署。

<!-- Spring Boot 热部署插件 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId>
</dependency>

2 使用

  导入依赖后,编辑代码时可通过单击锤子完成重新加载(此时不是所有文件都重新加载,只重新加载更改后的那个文件),使用锤子的前提是没有改变类的结构(可以编辑方法体中的内容,但是不能新增方法),通常锤子会比重启快一些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS中常用的几种事件

在js中分为多种事件&#xff0c;比如点击事件&#xff0c;焦点事件&#xff0c;加载事件&#xff0c;鼠标事件等等... ... 点击事件 onclick点击事件&#xff0c;ondblclick双击事件 焦点事件 onblur元素失去焦点&#xff0c;onfocus元素获取焦点 加载事件 onload一个页面…

windows本地访问局域网tensorboard

https://blog.csdn.net/m0_51268651/article/details/126524028 这个文章中说使用xshell配置ssh后可在windows访问 有一说一不太能理解为什么谷歌会做的那么麻烦 果然有更好的方案&#xff0c;如下&#xff1a; tensorboard --logdir/path/to/event --host 0.0.0.0 --port 6…

600条最强Linux命令总结

1. 基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -m 显示…

Linux 如何一键kill杀死某个被占用的端口

文章目录 一、例子&#xff1a;关闭8082端口二、查找被占用端口的PID三、 kill 掉这个进程总结 一、例子&#xff1a;关闭8082端口 [rootVM_0_59_centos root]# netstat -tln | grep 8082 tcp6 3 0 :::8082 :::* LISTEN二、查找…

考研数学|听完一遍汤家凤基础,1800都没思路,怎么办?

看了我这篇回答&#xff0c;保证你可以顺利的做1800题&#xff01; 如果你听了汤家凤老师的课&#xff0c;但是做题没思路&#xff0c;请不要担心&#xff0c;也不要急着换老师&#xff0c;你很有可能是方法错了。 请你反思一下&#xff1a; 1、你是不是听完课立刻就去做题。…

配音虾助力视频文案提取,提升内容创作效率

配音虾作为一款智能语音技术产品&#xff0c;正逐渐在视频内容创作领域崭露头角。它以其独特的语音转文字功能&#xff0c;助力视频文案提取&#xff0c;极大地提升了内容创作的效率。对于广大内容创作者来说&#xff0c;这无疑是一项革命性的工具。目前上线的渠道只有微信小程…

[小程序开发] 设置request封装请求参数

一、在类中定义实例属性&#xff0c;用来设置默认请求参数 defaults{baseURL:,//请求基准地址url:,//接口的请求路径data:null,//请求参数method:GET,//默认的请求方法//请求头header:{Content-type:application/json//设置数据的交互格式},timeout:60000//默认的超时时长&…

wpf ContentPresenter

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;ContentPresenter是一个关键组件&#xff0c;它负责在控件或模板中渲染和展示内容。以下是关于ContentPresenter在WPF中作用、特性和使用场景的详细说明&#xff1a; 目的 内容占位符&#xff1a…

MTMT 质押活动启动 ,坐享巨大BTCFi 市场红利

BTC是第一大加密货币&#xff0c;目前加密货币总市值为 2.6 万亿美元&#xff0c;BTC市值占比约为 51%。事实上&#xff0c;相对于开发程度更高的以太坊生态&#xff0c;BTC生态目前仍处于发展的极早期&#xff0c;这意味着仍旧巨大的BTC价值亟需释放&#xff0c;这也意味着 BT…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下&#xff0c;我们需要从别的系统获取数据时&#xff0c;一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼&#xff0c;旨在总结相关套路&#xff0c;提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

代码随想录 Day23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

669. 修剪二叉搜索树 class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root nullptr ) return nullptr;if (root->val < low) {TreeNode* right trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点return ri…

li标签间的空白问题解决

li 与 li 之间有看不见的空白间隔是什么原因引起的&#xff1f; 浏览器会把inline内联元素间的空白字符&#xff08;空格、换行、Tab等&#xff09;渲染成一个空格。为了美观&#xff0c;通常是一个<li>放在一行&#xff0c;这导致<li>换行后产生换行字符&#xf…

详解CAS(Compare and swap)

一、什么是 CAS CAS: 全称Compare and swap&#xff0c;字⾯意思:”⽐较并交换“&#xff0c;⼀个 CAS 涉及到以下操作&#xff1a; 我们假设内存中的原数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B。 比较 A 与 V 是否相等。&#xff08;⽐较&#xff09; 如果…

日志集中审计系列(3)--- LogAuditor接收UMA设备syslog日志

日志集中审计系列(3)--- LogAuditor接收UMA设备日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的实验或…

PyCharm中出现Microsoft Defender配置建议

原因 Windows安全中心的病毒和威胁防护会自动扫描电脑中的文件夹&#xff0c;我们的项目文件夹和IDE文件夹也会被扫描&#xff0c;而PyCharm认为这会降低IDE性能。 解决方法 直接点击提示框里的自动。 或是手动给扫描添加排除项&#xff0c;步骤如下&#xff1a; 1、先打开…

k8s1.28.8版本配置Alertmanager报警方式(邮件,企业微信)

文章目录 总结部署流程 Alertmanager 三大核心1. 分组告警2. 告警抑制3. 告警静默 报警过滤静默通知方案一&#xff1a;方案二&#xff1a; 抑制报警规则案例一 参考文档 自定义路由告警&#xff0c;分来自不同路由的告警&#xff0c;艾特不同的人员进行区分修改 alertmanager …

预训练大模型最佳Llama开源社区中文版Llama2

Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代。 作为AI领域最强大的开源大模型&#xff0c;Llama2基于2万亿token数据预…

【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环

目录 命名空间 命名空间的定义 命名空间的使用 输入输出 缺省参数 函数重载 引用 常引用 引用的使用场景 内联函数 auto 基于范围的for循环 命名空间 请看一段C语言的代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 10;int main…

java打家劫舍 1 (力扣Leetcode 198)

打家劫舍 1 力扣原题链接 问题描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报…

修改aws账户的密码和MFA

要使用AWS CLI删除当前账户的多因素认证(MFA)设备并修改密码&#xff0c;你需要先确保已安装并配置了AWS CLI&#xff0c;并且你的账户有足够的权限执行这些操作。下面是如何分步进行的指导&#xff1a; 1. 删除MFA设备 首先&#xff0c;你需要找出MFA设备的序列号或ARN。可以…