第二期:数据库初始化脚本与后端代码国际化方案
背景描述
新工作入职前两周,目前被分配到国际化项目。将已有的后端系统代码提示,数据库基础数据进行国际化。我主要负责数据库国际化。
数据库有两个项目脚本,分别的mongo数据库和pgsql数据库的初始化脚本与数据。
项目部署的整体流程是,复制和解压压缩包(包含了Ansible环境、K8S环境,项目镜像,项目依赖中间件环境),安装基础环境。通过Ansible脚本,将基础应用和项目应用部署到K8S环境中。
其中的项目代码是未国际化的版本。
后端代码国际化
代码提示国际化
完成目标:
- 实现代码提示国际化
个人探索方案是这样的,最终团队或者说基本上所有java后端springboot项目的国际化的通用方案。使用MessageSource和LocaleContextHolder,将国际化语言的文件放在resources下的i18n文件夹中,通过配置文件指定语言,通过LocaleContextHolder获取语言,通过MessageSource获取国际化的提示信息。
并且通过定义设置和获取Locale的方法,使用LocaleContextHolder.setLocale(locale)
和LocaleContextHolder.getLocale()
动态设置和获取语言。
数据库脚本国际化(废弃)
此方案废弃,因为获取内容要进过一层转化服务,方案是将数据库内容存储国际化Key,转换代码项目中存储i18n文件夹,通过MessageSource实现。这种通过AOP的方式增大了系统的性能开销。所以数据库通过在脚本仓库中添加国际化文件,在Ansible脚本中添加国际化参数的方式,控制数据的初始化加载。
- mongodb 查询返回结果国际化后的查询结果。实现jdbc template和mybatis的查询结果国陋化。
- pgsql 查询结果国际化。实现jdbc template结果国际化。
定义AOP切面,增强对应的JDBC Template查询
@Aspect
@Component
public class JdbcTemplateI18nAspect {
@Resource
private I18nResultHandler i18nResultHandler;
@Around("execution(* org.springframework.jdbc.core.JdbcTemplate.query*(..))")
public Object translateQueryResult(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed();
return i18nResultHandler.handleResult(result);
}
}
@Component
public class I18nResultHandler {
@Resource
private I18nService i18nService;
public Object handleResult(Object result) {
if (result == null) {
return null;
} else if (result instanceof List) {
return handleListResult((List<?>) result);
} else if (result instanceof Map) {
return handleMapResult((Map<?, ?>) result);
} else {
translateObject(result);
return result;
}
}
private List<?> handleListResult(List<?> results) {
if (results != null && !results.isEmpty()) {
for (Object result : results) {