springboot--异常处理、国际化、定制web服务器
异常处理
在controller层程序出现异常,并且未被捕获,springboot提供的异常处理机制将会生效。
springmvc的错误处理方案
如果使用了springmvc的错误处理方案,spring boot的错误处理方案不会生效
局部控制@ExceptionHandler
在控制器中写一个方法,方法使用@ExceptionHandler标注,凡是这个控制器中出现对应异常,则调用这个方法进行异常处理,局部生效。
// 默认响应json字符串
@RestController
public class UserController {
@GetMapping("/resource/{id}")
public String getResource(@PathVariable("id") Long id){
if (id ==1){
throw new IllegalArgumentException("无效id:"+id);
}
return "id"+id;
}
// springmvc局部方式处理异常
// 只有在UserController 中发生IllegalArgumentException异常时,才会调用此方法
@ExceptionHandler(IllegalArgumentException.class)
public String handlerIllegalArgumentException(IllegalArgumentException exception){
return exception.getMessage();
}
}
全局控制@ControllerAdvice+@ExceptionHandler
把以上局部生效的方法单独放到一个类中,这个类使用@ControllerAdvice标注,凡是任何控制器中出现对应的异常,则会调用对应方法,全局生效。
// 对于所有的控制器都有效
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public String handlerIllegalArgumentException(IllegalArgumentException exception){
return exception.getMessage();
}
}
spring boot的错误处理方案
spring boot的默认处理方案如下:
- 如果客户端需要json格式,则直接响应json格式的错误信息。
- 如果客户端需要HTML页面,则按照下面步骤执行:
- 第一步(精确错误码文件):去classpath:/templates/error/目录下找404.html 500.html等精确码文件。如果找不到则去静态资源目录下的/error目录下找,如果找不到,进入下一步
- 第二步(模糊错误码文件):去classpath:/templates/error/目录下找4xx.html 5xx.html等精确码文件。如果找不到则去静态资源目录下的/error目录下找,如果找不到,进入下一步
- 第三步(通用错误页面):去找classpath:/templates/error.html,如果找不到,则进入下一步
- 第四步(默认错误处理):使用默认错误处理,即/error端点。
如何在错误页获取错误信息
spring boot默认在model中放置以下信息:
- timestamp:错误发生的时间戳
- status:HTTP状态码
- error:错误类型
- exception:异常类名
- message:错误信息
- trace:堆栈跟踪
spring boot3.3.5版本默认只向model对象中绑定timestamp、status、error。如果要保存exception、message、trace,需要开启以下三个配置:
server.error.include-exception=true
server.error.include-stacktrace=always
server.error.include-message=always
前后端分离项目的错误处理方案
使用springmvc的错误处理方案,定义全局处理异常@ControllerAdvice+@ExceptionHandler,返回json格式的错误信息。
服务器端负责页面渲染的项目错误处理方案
- 如果发生的异常时HTTP错误状态码
- 建议常见的错误码使用精确错误码文件
- 不常见的错误码使用模糊错误码文件
- 业务相关异常
- 在程序中处理具体异常,通过程序自行决定跳转哪个页面
- 建议提供class path:/templates/error.html 来处理通用错误。
国际化
1.创建资源文件
创建包含不同语言版本的消息文件,这些文件默认放在src/main/resources目录下,并且以.properties为扩展名,字符集设置UTF-8。例如
- messages.properties(默认语言如英文)
- messages_zh_CN.properties(简体中文)
- messages_fr.properties(法语)
每个文件应包含相同的消息键,但值对应相应的语言
messages.properties:
welcome.message= welcome to our application!
messages_zh_CN.properties:
welcome.message=欢迎来到我们的应用!
2.在模板文件中取出消息
语法格式是#{welcome.message}
比如:
定制web容器
web服务器切换为jetty
spring boot默认使用tomcat,如何切换为jetty?
实现方式:排除tomcat,添加jetty依赖
<!-- 排除tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加jetty依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
tomcat服务器调优参数
# 请求超时时间
server.tomcat.connection-timeout=2000
#设置tomcat处理请求的最大线程数为200
#超过这个数量,tomcat会把多余的请求放到队列中
#如果队列也满了(由server.tomcat.accept-count配置),新的请求将被拒绝,返回一个“503 Service Unavailable”错误
server.tomcat.max-threads=200
# 等待队列的最大容量
server.tomcat.accept-count=100
# tomcat空闲时至少保持10个线程处于活动状态,以便快速响应新的请求
server.tomcat.threads.min-spare=10
# 允许tomcat在关闭后立即重新绑定相同的地址和端口,即使端口还在time_wait状态
#当一个网络链接关闭时,操作系统会将该链接的端口保持在time_wait状态一段时间(通常时2-4分钟)。以确保所有未完成的数据包能被正确处理。在这段时间内,该端口不会被其他进程绑定。
server.tomcat.address-reuse-enabled=true
# 设置tomcat绑定到所有可用的网络接口,使其可以从任何网络地址访问
server.tomcat.bind-address=0.0.0.0
# 设置tomcat使用HTTP/1.1协议处理请求
server.tomcat.protocol=HTTP/1.1
# 设置tomcat的session超时时间
server.tomcat.session-timeout=30
# tomcat静态资源缓存时间3600秒
server.tomcat.resource-cache-period=3600
# 解决get请求乱码。对请求的url进行编码
server.tomcat.uri-encoding=UTF-8
# 设置tomcat的基础目录为当前目录。这个配置指定tomcat的工作目录。包括日志文件,临时文件,运行时生成的文件的存放位置,生产环境中可能需要重新配置。
server.tomcat.basedir=.
本文来自博客园,作者:NE_STOP,转载请注明原文链接:https://www.cnblogs.com/alineverstop/p/19539414
浙公网安备 33010602011771号