背景

国际化是指在设计软件,将软件与特定语言及地区脱钩的过程。当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正。

本文提到的异常响应信息国际化是指:前端向后台发起请求,后台在处理逻辑中发生异常,把异常信息返回给前端,返回的异常信息应该支持国际化,能够对应特定的语言、地区等环境。例如,中文语言环境下返回的异常信息应该是中文的,英文语言环境下返回的则是对应的英文。

javaweb项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出)、不可预知的异常需要处理。一般dao层、service层的异常都会直接抛出,最后由controller统一进行处理,并对前端请求进行异常响应。针对此处的业务异常应该做到设计合理,统一格式,并且支持国际化。

springboot是一个开源的Java/Java EE的应用程序框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。利用springboot提供的API库,我们能方便地做到全局异常统一拦截,并且Spring提供了完善的国际化支持,在此基础上,我们能方便地做到全局异常信息的国际化。

原来存在的方案:

局部的异常信息国际化:程序在抛出异常时手动设置好国际化之后的异常message。

此种方案代码耦合性强,代码繁琐,处理逻辑过程中抛出异常时还得额外考虑对异常进行国际化操作,使得代码逻辑无法很好的集中在业务逻辑的处理。示意图如图1.1。

半异常信息国际化:程序中未采用配置文件来记录国际化资源,而是直接在程序中写死了固定的异常值,每条异常值记录分别对应着不同的异常编号、某几种语言的异常信息。

这是目前比较常见的方式,写起来方便,不需要在程序抛出异常时做国际化,只需在全局异常拦截中做统一的异常返回。但是,这种方式支持的异常信息比较单一,不能轻易添加多种语言的支持,只能改动现有程序的代码。示意图如图1.2。

使用编程语言自带的异常本地化接口。

不少后台语言提供了异常信息本地化接口,比如java提供的java.lang.Throwable#getLocalizedMessage方法,但是这种方式只能获取到本地语言相关的对应的信息,并不能很好的支持多种语言,以及多种语言间的自由切换。

现在的方案

此方案结合异常码、字符串占位符和资源文件的特点及优势。异常码可理解为一个异常信息的ID,具有唯一性,必要性;异常信息资源文件中的值可包含占位符(格式为{n}),处理异常时可用实际值替换,达到异常信息的进一步具体化,但不是必须的。资源文件就是内容为“异常码=提心信息”的记录的文件。

方案具体描述如下:

首先,在springboot项目中定义系统的http请求统一返回的数据格式,此处我们的定义包含三个属性: code(业务异常状态码)、message(异常提示信息)、data(无异常时返回的数据体)。对异常信息国际化主要体现在message属性,也就是返回前端给用户展示的异常提示信息。code属性用于确定唯一的异常。其次定义需要抛出的业务异常,其中主要包括code(异常码)和params(用于替换异常信息字符串占位符{n}的实际值)属性。

在项目路径下定义异常信息的资源文件,文件内容包含多条记录,每条记录为键值对的形式,即key=value。对需要实现的语言种类分别提供一份对应的文件,这些文件名除默认信息外,均包含语言(地区信息),文件中包含中key是一致的,value为相应语言的字符串组成。如果添加语言的支持,只需要添加一份对应的资源文件即可。以下包含默认、英文环境和简体中文环境下对应的异常提示信息国际化资源文件,如图2.1

利用springboot的提供的接口定义统一拦截器,并且注入http请求上下文和资源获取器,在拦截器中对应用抛出的异常进行捕获,针对上述特定的异常做国际化处理。

其国际化处理逻辑如下:根据http请求传入的语言信息指定特定的语言(地区)环境,如没有传入语言信息,则采用应用默认的语言配置;据此读取上述编写好的对应的异常信息资源文件,并依据捕获的异常中的code(异常码)查到到对应的字符串,将params实际值替换掉字符串中的占位符,完成后即为返回给前端的异常提示信息。

在controller、service和dao层中根据程序逻辑抛出相应异常,其中异常码应该在资源文件中已定义。示例代码如下图2.3

整体流程图如下图2.4

demo

以下是一个demo,其中提供了必要的代码注释,以便于理解。

自定义异常结构,包含code和params

异常资源文件定义

全局异常拦截

代码逻辑中抛出异常

请求响应示例

请求1:http://127.0.0.1:8080/demo?lang=en&msg=a

返回:

请求2:http://127.0.0.1:8080/demo?lang=zh_CN&msg=a

返回:

请求3:http://127.0.0.1:8080/demo?lang=en&msg=c

返回:

请求4:http://127.0.0.1:8080/demo?lang=zh_CN&msg=c

返回:

源码

总结

此方案能较好地处理异常信息的国际化,能自如地添加资源文件,不需要改动此方案的现有代码,这也使得程序耦合性降低;

统一的异常格式定义、全局异常拦截极大程度上减少了代码耦合性,大大简化了团队编码中对异常逻辑的处理,能减少重复性编码,有利于提高工作效率;

现有方案未能较好地支持异常信息中特定值的支持,此方案利用设置占位符的方式,较好地做到了支持,灵活方便;

springboot支持的国际化实现中默认提供了缓存支持,性能良好。

参考

(文中配图有空再改!!)

java 异常国际化_基于springboot实现http响应异常信息国际化相关推荐

  1. java定时任务管理_基于SpringBoot+layui秒级定时任务管理:JTimer for JAVA项目

    一.JTimer for JAVA简介 1.项目介绍 JTimer for JAVA是基于SpringBoot+layui秒级定时任务管理,取代crontab.其PHP版本 https ://gite ...

  2. java 快递项目_基于SpringBoot开发的Java快递代拿系统

    该项目基于 [基于SSM开发的Java快递代拿系统] 项目全面升级,使用当前最为流行的 SpringBoot 框架,相关技术栈全面更新!是您深入学习 SpringBoot 开发的最佳实践! 相关技术栈 ...

  3. java 延时发送邮件_基于SpringBoot实现定时发送邮件过程解析

    前提: 1.springboot项目 2.引入maven 依赖 org.springframework.boot spring-boot-starter-mail 以下代码中涉及到的maven依赖有日 ...

  4. java jwt刷新_基于springboot+jwt实现刷新token过程解析

    前一段时间讲过了springboot+jwt的整合,但是因为一些原因(个人比较懒)并没有更新关于token的刷新问题,今天跟别人闲聊,聊到了关于业务中token的刷新方式,所以在这里我把我知道的一些点 ...

  5. java图书销售系统_基于springboot的小型图书销售系统 源码下载

    源码介绍 本系统采用B/S架构,服务器用的是tomcat服务器,数据库使用mysql,数据库连接池使用的是阿里开源的druid连接池,实现了前后端分离,后端框架基于spring boot整合mybat ...

  6. quartz配置_基于spring-boot 2.x +quartz 的CRUD任务管理系统

    基于spring-boot 2.x + quartz 的CRUD任务管理系统,适用于中小项目. 开发环境 JDK1.8.Maven.Eclipse 技术栈 SpringBoot 2.0.1.thyme ...

  7. java抢单功能_基于消息队列的高并发抢单功能实现方法与流程

    本发明涉及嵌入式软件中间件,具体涉及一种基于消息队列的高并发抢单功能实现方法. 背景技术: 中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络 ...

  8. idea新建springboot后端到前端_基于SpringBoot+AntDesign的快速开发平台

    项目介绍 Jeecg-Boot是一款基于SpringBoot+代码生成器的快速开发平台!前后端分离架构.技术采用SpringBoot.AntDesignVue.Mybatis.Shiro.JWT.强大 ...

  9. Java权限管理|基于springBoot+springSecurity+jwt实现前后端分离用户权限认证

    基于springBoot+springSecurity+jwt实现前后端分离用户权限认证 1. 项目说明   主要基于前后端分离情况下用户权限认证, 当用户登录认证成功后,每个用户会获取到自己的tok ...

最新文章

  1. python打包为exe文件_Pyinstaller(python打包为exe文件)
  2. pfsense软路由防火墙(安装过程、L2tp配置)
  3. HBase java 开发
  4. java对象的初始化顺序_Java对象初始化顺序
  5. wxWidgets:测试样品
  6. Linux下汇编语言学习笔记47 ---
  7. Numpy基础语法--linspace与zeros与ones
  8. MySql常用函数大全(详细)
  9. 用于机器学习的数据库--UCI数据库
  10. 爱快软路由常见问题汇编(2018-04-21)
  11. 智课雅思词汇---十二、vent是什么意思
  12. QQ红包金额分配算法
  13. 英语语法笔记——名词性从句(三)
  14. 30 个 Python 的最佳实践、小贴士和技巧
  15. mysql语言中子查询是什么_SQL查询语句中,什么叫子查询?
  16. 南科大学生对网络授课的反馈
  17. 超简单地输出所有水仙花数(Java实现)
  18. 2021-2027全球与中国电动垂直起降(eVTOL)飞行器基础设施市场现状及未来发展趋势
  19. C66X中断整理 6678中断配置(含例程)
  20. 批量插入CAD块及标注(带程序运行计时功能)

热门文章

  1. uwb定位与蓝牙定位成本对比分析
  2. 解读 Oracle 12c 自适应执行计划一例
  3. 线上慎用Java断言
  4. Ubuntu安装人脸识别认证软件Howdy
  5. 爬取某位大佬简书上所有文章并保存为pdf
  6. 织梦5.7登陆注册实现
  7. vue页面导出Word文档(含图片)
  8. C 语言课程设计 最终答辩版 学生通讯录管理系统
  9. 使用window.open打开新窗口被谷歌浏览器拦截
  10. Ubuntu16.04安装NCCL