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

SpringBoot中使用MessageSource的getMessage获取i18n资源文件中的消息

 场景

springboot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在resources/下创建国际化配置文件即可,注意名称必须以messages开始。 messages.properties (默认的语言配置文件,当找不到其他语言的配置的时候,使用该文件进行展示)。

比如在resoure下新建i18n目录,在此目录下新建message.properties

在此资源文件中配置一些消息的映射,这样在需要使用的代码中统一使用左边的code进行获取,在显示时会显示右边的消息。

那么如果要修改显示的消息的话直接修改此文件中的右边显示的文本,就不用在每一处代码就行修改了。

注:

博客:
霸道流氓气质-CSDN博客
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

首先上面新建了资源文件message.properties

not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效

添加一些自定义消息。

然后需要告诉spring国际化资源文件的位置。

打开application.yml

spring:# 资源信息messages:# 国际化资源文件路径basename: i18n/messages

配置完成后新建一个工具类MessageUtils

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import com.common.utils.spring.SpringUtils;/*** 获取i18n资源文件**/
public class MessageUtils
{/*** 根据消息键和参数 获取消息 委托给spring messageSource** @param code 消息键* @param args 参数* @return 获取国际化翻译值*/public static String message(String code, Object... args){MessageSource messageSource = SpringUtils.getBean(MessageSource.class);return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());}
}

因为这是在工具类中,属于不受Spring管理的环境,所以通过

SpringUtils.getBean(MessageSource.class);

来获取MessageSource这个Bean

工具类代码

package com.common.utils.spring;import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;/*** spring工具类 方便在非spring管理环境中获取bean**/
@Component
public final class SpringUtils implements BeanFactoryPostProcessor
{/** Spring应用上下文环境 */private static ConfigurableListableBeanFactory beanFactory;@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{SpringUtils.beanFactory = beanFactory;}/*** 获取对象** @param name* @return Object 一个以所给名字注册的bean的实例* @throws org.springframework.beans.BeansException**/@SuppressWarnings("unchecked")public static <T> T getBean(String name) throws BeansException{return (T) beanFactory.getBean(name);}/*** 获取类型为requiredType的对象** @param clz* @return* @throws org.springframework.beans.BeansException**/public static <T> T getBean(Class<T> clz) throws BeansException{T result = (T) beanFactory.getBean(clz);return result;}/*** 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true** @param name* @return boolean*/public static boolean containsBean(String name){return beanFactory.containsBean(name);}/*** 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)** @param name* @return boolean* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException**/public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException{return beanFactory.isSingleton(name);}/*** @param name* @return Class 注册对象的类型* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException**/public static Class<?> getType(String name) throws NoSuchBeanDefinitionException{return beanFactory.getType(name);}/*** 如果给定的bean名字在bean定义中有别名,则返回这些别名** @param name* @return* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException**/public static String[] getAliases(String name) throws NoSuchBeanDefinitionException{return beanFactory.getAliases(name);}/*** 获取aop代理对象** @param invoker* @return*/@SuppressWarnings("unchecked")public static <T> T getAopProxy(T invoker){return (T) AopContext.currentProxy();}
}

获取到MessageSource后,直接调用其getMessage方法,传递一个code参数和Local参数,code就是在

资源文件中配置的左边的 编码

Locale参数的获取是通过

LocaleContextHolder.getLocale()

可以看MessageSource接口的源码

package org.springframework.context;import java.util.Locale;
import org.springframework.lang.Nullable;public interface MessageSource {@NullableString getMessage(String var1, @Nullable Object[] var2, @Nullable String var3, Locale var4);String getMessage(String var1, @Nullable Object[] var2, Locale var3) throws NoSuchMessageException;String getMessage(MessageSourceResolvable var1, Locale var2) throws NoSuchMessageException;
}

来获取

工具类封装完成,怎样根据code获取消息

String message = MessageUtils.message("user.jcaptcha.expire")

http://www.xdnf.cn/news/1142605.html

相关文章:

  • [spring6: PointcutAdvisor MethodInterceptor]-简单介绍
  • Spring学习笔记:Spring SPEL表达式语言深入的学习和使用
  • 算法竞赛备赛——【图论】求最短路径——小结
  • [论文阅读] 人工智能 + 软件工程 | 单会话方法论:一种以人类为中心的人工智能辅助软件开发协议
  • nginx-http反向代理与负载均衡
  • Mysql定位慢查询
  • 数组/链表/【环形数组】实现 队列/栈/双端队列【移动语义应用】【自动扩缩】
  • 前端笔记之 async/await 异步编程详解
  • A33-vstar笔记及资料分享:搭建交叉编译环境
  • 怎么把图片做成实拍的感觉?给图片加上拍摄时间,相机信息等就可以了
  • Linux系统安装Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南
  • JavaSE -- 对象序列化和反序列化详细讲解
  • springCloud -- 微服务01
  • H3CNE小小综合实验
  • Linux C 进程间通信基本操作
  • Flutter 多语言(国际化)入门教程
  • 【Flutter】深入理解 Provider:不仅仅是Consumer
  • MySQL:数据类型
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度拷问
  • 开源的大语言模型(LLM)应用开发平台Dify
  • Ubuntu系统下编译安装FreeSWITCH 1.10.12
  • 指定阿里镜像原理
  • 工业数据集成中间件工具OPC Router详细介绍
  • Redis原理之哨兵机制(Sentinel)
  • [Linux]如何設置靜態IP位址?
  • Unity 堆栈分析实战指南 C#
  • wx小程序设置沉浸式导航文字高度问题
  • HIVE实战处理(二十四)留存用户数
  • Web3+AI融合新纪元:Sollong用智能终端重塑协作计算未来
  • 区别下IO多路复用,reactor,事件循环(EventLoop),Epoll这几个的概念以及之间的关系