首页 > 其他分享 >SpringBoot中使用MessageSource的getMessage获取i18n资源文件中的消息_OK

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

时间:2024-05-14 20:43:54浏览次数:16  
标签:return SpringBoot springframework String getMessage org OK throws name

https://www.cnblogs.com/badaoliumangqizhi/p/13608623.html

 

场景

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

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

 

 

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

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

首先上面新建了资源文件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;

    @Override
    public 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 {
    @Nullable
    String 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")

标签:return,SpringBoot,springframework,String,getMessage,org,OK,throws,name
From: https://www.cnblogs.com/zhoading/p/18192213

相关文章

  • 【JavaWeb】前后端分离SpringBoot项目快速排错指南
    1发起业务请求打开浏览器开发者工具,同时显示网络(Internet)和控制台(console)接着,清空控制台和网络的内容,如下图然后,点击你的业务按钮,发起请求。首先看控制台有没有报错信息,这是最直观的,看不懂英文就去翻译一下,百度一下如果控制台的信息并没有什么价值,或者指明是后端的问题,那么......
  • .NET使用P/Invoke来实现注册表的增、删、改、查功能
    注册表可以用来进行存储一些程序的信息,例如用户的权限、或者某些值等,可以根据个人需要进行存储和删减。当前注册表主目录:引用包 Wesky.Net.OpenTools1.0.5或者以上版本 操作演示:创建注册表项设置注册表值读取注册表值删除注册表值删除注册表项操作演示代码IR......
  • IDEA社区版(IDEA Community Edition)创建Springboot父子项目
    1.因为社区办不支持使用springSpringInitializr的方式创建项目,但是我们可以考虑使用别的方式达到效果:创建方式有3种:第一种:使用https://start.spring.io/官方URL创建项目,再导入到IDEACommunityEdition(后面简称:ideaC)。具体使用自行百度。缺点:没办法自定义springboot的......
  • 【SpringBoot】实现项目启动后执行的两个接口ApplicationRunner和CommandLineRunner
    开发中可能会有这样的场景,需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。两个启动加载接口分别是:CommandLineRunner和ApplicationRunner。Spring提供了接口InitializingBean,jdk提供了@PostCo......
  • springboot+vue创建_1
    Springboot+vue创建一、创建后台项目1.在文件夹创建一个空文件夹,在idea中打开它2.可以先修改一下file-->settings-->Maven里面的一下东西,改成自己的maven地址(以免后面pom.xml文件有问题)3.在sb_vue_mo中右键-->new-->Module,选择SpringInitializer之后自行修改我是选择了ja......
  • 记录一次Springboot Data Jdbc的autoWorkController异常
    Errorcreatingbeanwithname'autoWorkController':Unsatisfieddependencyexpressedthroughfield'jdbcRouteRepository':Errorcreatingbeanwithname'jdbcRouteRepository'definedincom.chint.infrastructure.repository.jdbc......
  • Springboot+React实现Minio文件分片上传、断点续传
    前言本文采用前后端结合,后端给前端每个分片的上传临时凭证,前端请求临时url,通过后端间接的去上传分片。其实无关乎vue或者react,思路都是一样的,逻辑也全都是js写的,跟模板语法或者jsx也没关系,仅仅是赋值不一样而已。前端:React+TypeScript+Antd+axios+spark-md5+p-......
  • springboot文件上传下载到本机服务器上
    这次的文件上传下载仅指的是本机的服务器,不指第三方文件存储系统!!!1.在pom中加入以下依赖,如已经加入,请忽略<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <depende......
  • 微信3.9.8.25机器人(Hook注入)搭建教程文档
    开源地址https://github.com/ttttupup/wxhelper  微信破解dllhttps://github.com/nefarius/Injector  注入工具https://github.com/tom-snow/wechat-windows-versions/releases 微信历史版本基本原理启动指定版本PC微信以后,利用注入程序将dll文件注入到微信进程内,可......
  • 使用 Playwright 复用 Cookie:简化自动化测试的高效方法
    前言在进行自动化测试时,有时需要在多个测试用例之间共享相同的会话状态。为了实现这一目标,Playwright提供了一种称为Cookie复用的功能,可以让我们在不同的测试用例之间共享同一组Cookie数据。本文将深入介绍如何使用Playwright复用Cookie,并探讨其使用方法和优势。什么是......