当前位置: 首页 > news >正文

SpringBoot错误码国际化

先看测试效果: 

f7d7139e9f424832bcfdc5ee3863e0cb.png

130cff648d04407f8596fc3fa198e4ee.png

 374f7511d19047e999d8f22c9594cb39.png

60cb9ee209844d978fd20651436d7ee7.png

文件结构 

1b9d1f77e3c2465a92b8242e614ff7df.png

f8383146592c4740b0bb8fb910013b40.png

1.中文和英文的错误消息配置

bfd2cba4de2e4c4e987e3dbbc343d3aa.png

package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/
@Getter
public enum ExceptionEnum {//# code命名规则:模块编码 + 唯一序号 11表示用户管理模块LOGIN_EXCEPTION(1101),OTHER_EXCEPTION(1102);private Integer code;ExceptionEnum(Integer code) {this.code = code;}
}

2.统一响应类 

package com.ldj.mybatisflex.common;import lombok.Getter;
import lombok.Setter;
import org.springframework.context.i18n.LocaleContextHolder;import java.util.ResourceBundle;/*** User: ldj* Date: 2025/1/12* Time: 18:08* Description: 统一响应类*/
@Getter
@Setter
public class Response<T> {private static final String basePath = "i18n/message";private static final Integer successCode = 200;private static final String success = "成功!";private static final Integer failCode = 500;private static final String fail = "失败!";private Integer code;private String message;private T data;public static <T>Response<T> success(T data) {Response<T> response = new Response<>();response.setCode(200);response.setMessage(success);response.setData(data);return response;}public static <T>Response<T> fail() {return fail(failCode, fail);}//关键代码是读取国际化的配置文件,作为错误提示消息public static <T>Response<T> fail(ExceptionEnum exceptionEnum, T date) {Response<T> response = new Response<>();response.setCode(exceptionEnum.getCode());ResourceBundle bundle = ResourceBundle.getBundle(basePath, LocaleContextHolder.getLocale());String message = bundle.getString(exceptionEnum.getCode().toString());response.setMessage(message);response.setData(date);return response;}public static <T>Response<T> fail(Integer code, String message) {Response<T> response = new Response<>();response.setCode(code);response.setMessage(message);response.setData(null);return response;}
}

 3.登录拦截器

package com.ldj.mybatisflex.interceptor;import org.springframework.context.i18n.LocaleContext;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.i18n.SimpleLocaleContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;/*** User: ldj* Date: 2025/1/12* Time: 21:05* Description: 登录拦截器*/
@Order(1)
@Component
public class LoginUserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//需要前端传过来的,这里一直是nullString language = request.getHeader("language");//假设前端传"en_US"//language = "en_US";//默认是zh_CNif (language == null || "".equals(language) || "zh_CN".equalsIgnoreCase(language)) {LocaleContext localeContext = new SimpleLocaleContext(Locale.SIMPLIFIED_CHINESE);LocaleContextHolder.setLocaleContext(localeContext);}else {LocaleContext localeContext = new SimpleLocaleContext(Locale.US);LocaleContextHolder.setLocaleContext(localeContext);}System.out.println("配置语言:" + LocaleContextHolder.getLocale());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//请求结束后记得清理 ThreadLocal里面的值,好让垃圾回收器回收LocaleContextHolder.resetLocaleContext();}
}

 4.配置webmvc 应用登录拦截器

package com.ldj.mybatisflex.config;import com.ldj.mybatisflex.interceptor.LoginUserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** User: ldj* Date: 2025/1/12* Time: 21:00* Description: No Description*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginUserInterceptor loginUserInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginUserInterceptor);}
}

5.测试

package com.ldj.mybatisflex.controller;import com.ldj.mybatisflex.common.ExceptionEnum;
import com.ldj.mybatisflex.common.Response;
import com.ldj.mybatisflex.model.dao.UerInfoDAO;
import com.ldj.mybatisflex.model.dto.UserLoginReqDTO;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;/*** User: ldj* Date: 2024/11/17* Time: 16:55* Description: No Description*/
@RestController
@RequestMapping("/userInfo")
@CrossOrigin(maxAge = 3600)
public class UserInfoController {@PostMapping(value = "/login")public Response<UerInfoDAO> login(@RequestBody @Valid UserLoginReqDTO userLoginReqDTO){return Response.fail(ExceptionEnum.LOGIN_EXCEPTION, null);}
}

总结,这有个问题,每次读取配置文件都要操作io流,性能比直接定义在枚举差,3个字段,一个code ,1个cnMsg  ,1个enMsg,再写个方法判断是否中,英获取消息。

但是如果是法语,就失去灵活性,要改代码

 

相关文章:

SpringBoot错误码国际化

先看测试效果&#xff1a; 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//# code命名规则&#xff1a;模…...

LeetCode 3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间

【LetMeFly】3066.超过阈值的最少操作数 II&#xff1a;模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次…...

深度学习中的模块复用原则(定义一次还是多次)

文章目录 1. 模块复用的核心原则&#xff08;1&#xff09;模块是否有**可学习参数**&#xff08;2&#xff09;模块是否有**内部状态**&#xff08;3&#xff09;模块的功能需求是否一致 2. 必须单独定义的模块&#xff08;1&#xff09;nn.Linear&#xff08;全连接层&#x…...

Mac——Cpolar内网穿透实战

摘要 本文介绍了在Mac系统上实现内网穿透的方法&#xff0c;通过打开远程登录、局域网内测试SSH远程连接&#xff0c;以及利用cpolar工具实现公网SSH远程连接MacOS的步骤。包括安装配置homebrew、安装cpolar服务、获取SSH隧道公网地址及测试公网连接等关键环节。 1. MacOS打开…...

安全测评主要标准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 安全测评的主要标准‌包括多个国际和国内的标准&#xff0c;这些标准为信息系统和产品的安全评估提供了基础和指导。 一、安全测评的主要标准 1.1、国际标准 ‌可信计算机系统评估准则&#xff08;TC…...

qBittorent访问webui时提示unauthorized解决方法

现象描述 QNAP使用Container Station运行容器&#xff0c;使用Docker封装qBittorrent时&#xff0c;访问IP:PORT的方式后无法访问到webui&#xff0c;而是提示unauthorized&#xff0c;如图&#xff1a; 原因分析 此时通常是由于设备IP与qBittorrent的ip地址不在同一个网段导致…...

504 Gateway Timeout:网关超时解决方法

一、什么是 504Gateway Timeout&#xff1f; 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种&#xff0c;表示网关或代理服务器在等待上游服务器响应时超时。通俗来说&#xff0c;这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时&#xff1a;反向代…...

Vue 实现当前页面刷新的几种方法

以下是 Vue 中实现当前页面刷新的几种方法&#xff1a; 方法一&#xff1a;使用 $router.go(0) 方法 通过Vue Router进行重新导航&#xff0c;可以实现页面的局部刷新&#xff0c;而不丢失全局状态。具体实现方式有两种&#xff1a; 实现代码&#xff1a; <template&g…...

MCP Server开发的入门教程(python和pip)

使用python技术栈开发的简单mcp server 需要安装 MCP server的需要使用python-sdk,python需要 3.10,安装如下 pip install mcpPS: MCP官方使用的是uv包管理工具,我平时使用pip比较多,所以文中以pip为主。因为mcp的一些依赖包版本并不是最新的,所以最好弄一个干净的环境…...

手撕Transformer -- Day7 -- Decoder

手撕Transformer – Day7 – Decoder Transformer 网络结构图 目录 手撕Transformer -- Day7 -- DecoderTransformer 网络结构图Decoder 代码Part1 库函数Part2 实现一个解码器Decoder&#xff0c;作为一个类Part3 测试 参考 Transformer 网络结构 Decoder 代码 Part1 库函数…...

C#异步和多线程,Thread,Task和async/await关键字--12

目录 一.多线程和异步的区别 1.多线程 2.异步编程 多线程和异步的区别 二.Thread,Task和async/await关键字的区别 1.Thread 2.Task 3.async/await 三.Thread,Task和async/await关键字的详细对比 1.Thread和Task的详细对比 2.Task 与 async/await 的配合使用 3. asy…...

使用分割 Mask 和 K-means 聚类获取天空的颜色

引言 在计算机视觉领域&#xff0c;获取天空的颜色是一个常见任务&#xff0c;广泛应用于天气分析、环境感知和图像增强等场景。本篇博客将介绍如何通过已知的天空区域 Mask 提取天空像素&#xff0c;并使用 K-means 聚类分析天空颜色&#xff0c;最终根据颜色占比查表得到主导…...

145.《redis原生超详细使用》

文章目录 什么是redisredis 安装启动redis数据类型redis key操作key 的增key 的查key 的改key 的删key 是否存在key 查看所有key 「设置」过期时间key 「查看」过期时间key 「移除」过期时间key 「查看」数据类型key 「匹配」符合条件的keykey 「移动」到其他数据库 redis数据类…...

Pytorch基础教程:从零实现手写数字分类

文章目录 1.Pytorch简介2.理解tensor2.1 一维矩阵2.2 二维矩阵2.3 三维矩阵 3.创建tensor3.1 你可以直接从一个Python列表或NumPy数组创建一个tensor&#xff1a;3.2 创建特定形状的tensor3.3 创建三维tensor3.4 使用随机数填充tensor3.5 指定tensor的数据类型 4.tensor基本运算…...

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…...

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…...

HBASE学习(一)

1.HBASE基础架构&#xff0c; 1.1 参考&#xff1a; HBase集群架构与读写优化&#xff1a;理解核心机制与性能提升-CSDN博客 1.2问题&#xff1a; 1.FLUSH对hbase的影响 2. HLog和memstore的区别 hlog中存储的是操作记录&#xff0c;比如写、删除。而memstor中存储的是写入…...

element select 绑定一个对象{}

背景&#xff1a; select组件的使用&#xff0c;适用广泛的基础单选 v-model 的值为当前被选中的 el-option 的 value 属性值。但是我们这里想绑定一个对象&#xff0c;一个el-option对应的对象。 <el-select v-model"state.form.modelA" …...

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时&#xff0c;Kafka Listener 的默认行为是开始监听某个主题。但是&#xff0c;有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener&#xff0c;我们需要三种主要方法…...

C:JSON-C简介

介绍 JSON-C是一个用于处理JSON格式数据的C语言库&#xff0c;提供了一系列操作JSON数据的函数。 一、json参数类型 typedef enum json_type { json_type_null, json_type_boolean, json_type_double, json_type_int, json_type_object, json_type_ar…...

避坑指南:lidar_align标定IMU外参时,loader.cpp源码修改与运动轨迹设计的那些关键细节

避坑指南&#xff1a;lidar_align标定IMU外参的核心细节与实战优化 在自动驾驶和机器人定位领域&#xff0c;激光雷达与IMU的联合标定是系统搭建的关键环节。许多开发者在初次使用lidar_align工具时会遇到各种问题——从源码适配的困惑到标定结果的不可靠。本文将深入剖析两个最…...

保姆级教程:在OBBDetection项目中为DOTA数据集定制检测结果可视化(mmdetection 2.2)

深度定制OBBDetection检测结果可视化&#xff1a;DOTA数据集高级实践指南 在旋转目标检测领域&#xff0c;DOTA数据集因其复杂的航拍场景和多角度目标特性&#xff0c;对结果可视化提出了独特挑战。本文将带您从零构建一套完整的可视化解决方案&#xff0c;涵盖从基础配置到高级…...

PyAEDT终极指南:3个技巧让你快速掌握Python自动化工程仿真

PyAEDT终极指南&#xff1a;3个技巧让你快速掌握Python自动化工程仿真 【免费下载链接】pyaedt AEDT Python Client Package 项目地址: https://gitcode.com/gh_mirrors/py/pyaedt PyAEDT是Ansys Electronics Desktop&#xff08;AEDT&#xff09;的Python客户端工具包&…...

Java泛型中的List

本文将详细回答java泛型中的listt extends base>使用问题。 在java中&#xff0c;泛型提供了强大的类型安全机制&#xff0c;但其一些特点也容易引起混淆&#xff0c;如listt extends base>开发者经常感到困难。假设sub是base的子类&#xff1a;public class base { }pub…...

怎样避免网站因 SEO 优化而被搜索引擎惩罚

<h2>怎样避免网站因 SEO 优化而被搜索引擎惩罚</h2> <p>在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了任何网站想要获得流量和提升知名度的关键因素。SEO 优化的过程并不是一帆风顺&#xff0c;特别是在过度优化时&#x…...

万物识别在智能体(Skills Agent)中的集成应用

万物识别在智能体(Skills Agent)中的集成应用 想象一下&#xff0c;你正在开发一个智能客服机器人&#xff0c;用户发来一张照片&#xff0c;里面是自家厨房水槽下漏水的一堆零件。用户问&#xff1a;“这是什么东西坏了&#xff1f;我该买什么配件&#xff1f;” 传统的文本对…...

千问3.5-2B镜像免配置优势解析:supervisor自恢复+健康检查+7860端口标准化

千问3.5-2B镜像免配置优势解析&#xff1a;supervisor自恢复健康检查7860端口标准化 1. 千问3.5-2B镜像核心价值 千问3.5-2B是Qwen系列的小型视觉语言模型&#xff0c;专为图片理解与文本生成任务优化设计。这个开箱即用的镜像解决了传统AI模型部署中最让人头疼的三个问题&am…...

从‘双注意力网络’到MANet:手把手拆解CVPR经典模块在遥感分割中的魔改与应用

从双注意力机制到遥感图像分割&#xff1a;MANet的模块化设计与实战解析 遥感图像分割一直是计算机视觉领域的特殊挑战——当无人机以不同高度和角度拍摄地表时&#xff0c;同一张图像中可能同时存在微小的车辆和庞大的工业园区&#xff0c;这种极端的尺度变化让传统分割网络束…...

Qwen3-14B私有化效果:支持国密算法加密的API通信安全方案

Qwen3-14B私有化效果&#xff1a;支持国密算法加密的API通信安全方案 1. 私有部署镜像概述 Qwen3-14B私有部署镜像是基于通义千问大语言模型优化定制的专业解决方案&#xff0c;特别针对RTX 4090D 24GB显存配置进行了深度适配。这个镜像不仅提供了完整的运行环境和模型依赖&a…...

gh_mirrors/eg/eggs深度解析:一站式解决所有服务器部署难题

gh_mirrors/eg/eggs深度解析&#xff1a;一站式解决所有服务器部署难题 【免费下载链接】eggs Service eggs for the pterodactyl panel 项目地址: https://gitcode.com/gh_mirrors/eg/eggs 在服务器管理领域&#xff0c;快速部署和高效运维一直是开发者和管理员面临的核…...