SpringBoot 返回值 i18n 自动处理

定义基础通用类
[图片]

首先定义一波错误码:ResultCode

@Getter
@AllArgsConstructor
public enum ResultCode {SUCCESS(200, "请求成功", "request.success"),Fail(400, "请求失败", "request.failed"),PASSWORD_NOT_MATCH(100000, "密码不匹配", "password.not.match"),......;private final Integer code; // 错误码codeprivate final String desc; // 错误码描述private final String i18nKey; // 国际化字符串ResultCode(Integer code, String desc) {this.code = code;this.desc = desc;this.i18nKey = "";}}

定义返回对象:Result

@Getter
@Setter
public class Result<T> {private Integer code;private String message;private T data;public Result(Integer code, String message, T data) {this.code = code;this.message = message;this.data = data;}public Result() {}/*** 成功返回** @param data* @param <T>* @return*/public static <T> Result<T> success(T data) {return new Result<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getDesc(), data);}/*** 失败返回** @param message* @return*/public static Result<Object> failed(String message) {return new Result<>(ResultCode.Fail.getCode(), message, null);}/*** @param code* @param message* @return*/public static Result<Object> failed(Integer code, String message) {return new Result<>(code, message, null);}/*** @param code* @return*/public static Result<Object> failed(ResultCode code) {return new Result<>(code.getCode(), code.getDesc(), null);}
}

定义一个异常通用类:ApiException

@Getter
@Setter
public class ApiException extends RuntimeException {private static final long serialVersionUID = -8412830185919566727L;private Integer resultCode = ResultCode.UNKNOWN_CODE.getCode();private String I18nKey = "";public ApiException(String message) {super(message);}public ApiException(Integer resultCode, String message) {this(message);this.resultCode = resultCode;}public ApiException(Integer resultCode) {this(ResultCode.Fail.getDesc());this.resultCode = resultCode;}public ApiException(Throwable cause) {super(cause);}//支持传入code对象触发i18n数据public ApiException(ResultCode code) {this(code.getDesc());this.resultCode = code.getCode();this.I18nKey = code.getI18nKey();}
}

定义异常拦截器:ApiExceptionHandler

/*** 全局异常处理类* 指定拦截异常的类型,被捕获的异常会调用handler方法,方法名自己随便定***/
@RestControllerAdvice
public class ApiExceptionHandler {/*** ApiException异常处理** @param e 异常* @return 返回给前端的结果*/@ExceptionHandler(value = ApiException.class)public Result<Object> apiExceptionHandler(ApiException e) {String message = "";String i18nKey = e.getI18nKey();String i18nMessage = i18nUtils.getMessage(i18nKey);if(i18nMessage.isEmpty()){message = i18nKey;}else{message = i18nMessage;}if(!message.isEmpty()){return Result.failed(e.getResultCode(), message);}return Result.failed(e.getResultCode(), e.getMessage());}
}

定义 i18n 配置类:I18nConfig

@Slf4j
@Configuration
public class I18nConfig implements WebMvcConfigurer {public static final String COOKIE_NAME = "locale";@ResourceWebProperties webProperties;@Bean(name = "messageSource")public ResourceBundleMessageSource getMessageSource() throws Exception {ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();resourceBundleMessageSource.setDefaultEncoding("UTF-8");resourceBundleMessageSource.setBasenames("i18n/messages");resourceBundleMessageSource.setCacheSeconds(3);return resourceBundleMessageSource;}/*** @return SessionLocaleResolver*/@Beanpublic LocaleResolver localeResolver() {SessionLocaleResolver localeResolver = new SessionLocaleResolver();localeResolver.setDefaultLocale(getDefaultLocale());return localeResolver;}/*** Cookie方式*/@Beanpublic LocaleResolver localeResolver2() {CookieLocaleResolver clr = new CookieLocaleResolver();clr.setCookieName(COOKIE_NAME);//设置默认区域clr.setDefaultLocale(getDefaultLocale());//设置cookie有效期.clr.setCookieMaxAge(3600);return clr;}@Beanpublic LocaleChangeInterceptor localeChangeInterceptor() {LocaleChangeInterceptor lci = new LocaleChangeInterceptor();//对请求页面路径中的参数lang进行拦截lci.setParamName("lang");return lci;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(localeChangeInterceptor());}private Locale getDefaultLocale() {Locale locale = webProperties.getLocale();if (locale == null) {locale = Locale.SIMPLIFIED_CHINESE;}return locale;}}

定义 i18n 消息内容处理器:I18nUtils

@Slf4j
@Component
public class I18nUtils {@Resourceprivate MessageSource messageSource;/*** @param key:对应文本配置的key.* @return 对应地区的语言消息字符串*/public String getMessage(String key) {return this.getMessage(key, new Object[]{});}public String getMessage(String key, String defaultMessage) {return this.getMessage(key, null, defaultMessage);}public String getMessage(String key, String defaultMessage, Locale locale) {return this.getMessage(key, null, defaultMessage, locale);}public String getMessage(String key, Locale locale) {return this.getMessage(key, null, "", locale);}public String getMessage(String key, Object[] args) {return this.getMessage(key, args, "");}public String getMessage(String key, Object[] args, Locale locale) {return this.getMessage(key, args, "", locale);}public String getMessage(String key, Object[] args, String defaultMessage) {Locale locale = LocaleContextHolder.getLocale();String message = this.getMessage(key, args, defaultMessage, locale);return message;}public String getMessage(String key, Object[] args, String defaultMessage, Locale locale) {return messageSource.getMessage(key, args, defaultMessage, locale);}}

项目集成

编写i18n翻译文件

resources/i18n/messages.properties
password.not.match=密码不匹配resources/i18n/messages_zh_CN.properties
password.not.match=密码不匹配resources/i18n/messages_en_US.properties
password.not.match=The password does not match

接口处理层抛出异常

if (dateList.isEmpty()) {throw new ApiException(ResultCode.PASSWORD_NOT_MATCH);
}

数据返回
在这里插入图片描述

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

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

相关文章

【二叉树算法题记录】501. 二叉搜索树中的众数

题目链接 题目描述 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST …

Parasoft C++Test软件静态分析操作指南_编码规范/标准检查

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

python中的下划线用法总结

在 Python 中&#xff0c;下划线&#xff08;underscore&#xff09;有多种用法。它在不同的上下文中可以扮演不同的角色&#xff0c;下面是其常见用法的总结&#xff1a; 1. 单下划线"_" 1.1 作为临时变量或无用变量 在循环或解包操作中&#xff0c;表示一个临时…

微信小程序多端应用Donut Android生成签名

一、生成签名的作用 确保应用的完整性&#xff1a;签名可以确保应用在发布后没有被修改。如果应用被修改&#xff0c;签名就会改变&#xff0c;Android系统就会拒绝安装。确定应用的唯一身份&#xff1a;签名是应用的唯一标识&#xff0c;Android系统通过签名来区分不同的应用…

设计模式18—— 迭代器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 迭代器模式&#xff08;Iterat…

基环树学习笔记

理论基础&#xff1a; 内向基环树就是每个联通块有且仅有一个环&#xff0c;并且出度为1的有向图&#xff0c;每一个内向基环树都是由联通环和指向联通环的树枝组成。而且基环可以只有两个节点构成。 Leetcode - 2127&#xff1a;参加会议的最多员工数 题目&#xff1a; 一个…

【WP|4】WordPress 简码(Shortcode)开发详解

简码&#xff08;Shortcode&#xff09;是 WordPress 提供的一项强大功能&#xff0c;允许开发者创建自定义的代码块&#xff0c;以便在文章、页面或小工具中轻松插入动态内容。本文将详细讲解简码的开发&#xff0c;从基础概念到高级用法&#xff0c;帮助你充分利用这一功能。…

fine-tune Microsoft/Phi-3-mini-128k-instruct

目录 logging超参数模型和Tokenizer加载数据处理数据集加载与处理训练保存微调模型参考使用transformers在聊天指令数据集上使用LoRA对Phi-3语言模型进行微调,以改进会话理解和响应生成。 logging 日志记录:设置日志记录以跟踪训练过程。 import sys import loggingimport …

【RabbitMQ】SpringAMQP--消息转换器

SpringAMQP–消息转换器 测试发送Object类型消息 1.声明队列 Configuration public class FanoutConfig {Beanpublic Queue objectQueue(){return new Queue("object.queue");} }运行消费者后&#xff1a; 2.发送消息 RunWith(SpringRunner.class) SpringBootTes…

【数据结构与算法】七大排序算法(上)

【数据结构与算法】七大排序算法(上) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 排序的概念及应用 1.1 排序的概念 1.2 排序的应用 1.3 常见排序算法 2. 常…

开源博客项目Blog .NET Core源码学习(23:App.Hosting项目结构分析-11)

本文学习并分析App.Hosting项目中后台管理页面的标签管理页面、轮播图维护页面。 标签管理页面 标签管理页面用于显示、检索、新建、编辑、删除标签数据&#xff0c;以便在前台页面的首页及文章专栏等页面显示标签数据。标签管理页面附带一新建及编辑页面&#xff0c;以支撑新…

设计井字棋游戏(一)

创建游戏登录注册窗口 用户名admin 密码admin&#xff08;可自行改变&#xff09; 主页面 1. 导包 import pickle&#xff1a;导入 pickle 模块&#xff0c;这是一个 Python 的内置模块&#xff0c;用于将 Python 对象序列化和反序列化。序列化是指将对象转换为字节流&am…

如同“水生态”的存储引擎|OceanBase数据转储合并技术解读(一)

本系列文章主要围绕 OceanBase数据库存储引擎中的转储合并进行解读&#xff0c;涉及到数据存储、转储合并、数据校验等方面的内容&#xff0c;旨在让读者了解OceanBase数据库的存储引擎中与转储合并有关的各种概念&#xff0c;帮助读者更好地理解OceanBase数据库的存储技术原理…

基于STM32实现智能饮水机控制系统

目录 引言环境准备智能饮水机控制系统基础代码示例&#xff1a;实现智能饮水机控制系统 温度传感器数据读取水泵和加热器控制水位传感器数据读取用户界面与显示应用场景&#xff1a;家庭和办公室的智能饮水管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在S…

关于pdfbox读取pdf

最近&#xff0c;想着将pdf的文件进行读取其内容&#xff0c;发现了一个比较好用的依赖pdfbox。目前使用这个依赖&#xff0c;进行实现一个简单实例&#xff0c;如果之后需要使用到更深的了解&#xff0c;会进行更新。这里提醒一下&#xff1a;jdk8尽量采用pdfbox3.x版本。 对…

Linux一键安装Docker、kkfileviewer

Linux一键安装Docker、kkfileviewer 一、安装docker 安装docker脚本 vi initDocker.sh脚本内容 #安装前先更新yum&#xff0c;防止连接镜像失败 yum -y update#卸载系统之前的docker&#xff08;可选择&#xff0c;我这里直接注释了&#xff09; #yum remove docker docker…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

【驱动】串口硬件流控和RS485自动收发

1、流控(Flow Control) 串口通信中的流控(Flow Control)是一种用于管理数据传输速率,防止数据丢失的机制。 流控可以分为硬件流控(Hardware Flow Control)和软件流控(Software Flow Control),两者的目的都是确保发送方和接收方在数据传输过程中同步。 1.1 硬件流控…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心&#xff08;上篇&#xff09; 热身tops&#xff1a;选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式&#xff0c;开发模式他会跟你提示代码出现错误的地方以及出错原因&#xff0c;而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

数据库语法树优化

目录 一、σ、π、⋈ 1.选择σ 2.投影π 3.连接⋈ 二、 构建语法树 ① 解读sql语句 ② 写出关系代数表达式 ③ 画出语法树 三、优化语法树 四、练习 语法树优化方法 一、σ、π、⋈ 1.选择σ 选择就是在关系R中选择满足给定条件的诸元组。 通过条件SdeptIS选择出系别…