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,一经查实,立即删除!

相关文章

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

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

微信小程序多端应用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; 一个…

【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;以支撑新…

如同“水生态”的存储引擎|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的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

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

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

数据库语法树优化

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

基于香橙派搭建家庭网盘

一、概述 家庭网盘是一种用于家庭用户的在线存储和文件共享服务。它允许家庭成员在云端存储、同步和分享照片、视频、文档等文件&#xff0c;方便快捷地访问和管理个人和家庭数据。家庭网盘通常提供安全可靠的数据存储和备份功能&#xff0c;保障用户数据的安全性。此外&#x…

一文解决弹窗交互设计难题,轻松上手

弹窗交互的分类 我们每天所说的弹出窗口是一个非常笼统的概念。我们习惯性地称所有的对话框、浮层和提示条为弹出窗口。事实上&#xff0c;弹出窗口可以分为两种类型&#xff1a;模态弹出框和非模态弹出框。在 UI 在设计中&#xff0c;当它迫使用户与之交互时&#xff0c;我们…

【算法】【二叉树,DFS,哈希集合,分类讨论】力扣1110. 删点成林

1110. 删点成林 文章目录 【算法】力扣【二叉树&#xff0c;DFS&#xff0c;哈希集合&#xff0c;分类讨论】1110. 删点成林题目描述示例 1&#xff1a;示例 2&#xff1a; 输入输出示例解释思路解析核心思想算法步骤复杂度分析 代码实现总结 【算法】力扣【二叉树&#xff0c…

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天&#xff0c;埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资&#xff0c;主要用于打造一台巨大的超级计算机&#xff0c;马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI&#xff0c;技术和算力的发展历经了几个时代&#xff0c;但似乎马斯克的吸金能力一直…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树&#xff0c;在中序遍历后的结果为从小到大的一个序列&#xff0c;寻找二叉搜索树的最小绝对值差&#xff0c;只需比较一个节点与之后的差值即可。在遍历的过程中&#xff0c;我们需要一个节点保存前节点…