Spring之国际化配置MessageSource

   最近对项目做优化,将硬编码在代码中的错误信息、提示信息抽取出来,整合到文件中以方便修改。经过查找资料发现Spring的MessageSource可满足这个需求。下面记录一下学习的时候写的demo。

一、SpringBoot配置国际化(Java Bean的配置方式)

1、目录结构

 

2、pom.xml文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.snails</groupId>
    <artifactId>snails_message</artifactId>
    <packaging>war</packaging>

    <name>snails_message Maven Webapp</name>
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>snails_message</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
View Code
复制代码

3、SnailsMessageConfig配置类

复制代码
package com.snails.config;

import org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.Locale;

/**
 * @ClassName MessageConfig
 * @Description 国际化配置类
 * @Author snails
 * @Date 2020/9/12 11:01
 * @Version 1.0
 */
@Configuration
public class SnailsMessageConfig {

    /**
     * 定义MessageSource的bean
     * @return
     */
    @Bean(name="messageSource")
    public ResourceBundleMessageSource getMessageSource(){
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        /**
         * 设置配置文件读取路径
         *      i18n/messages:i18n - 文件所在的目录; messages - 文件的前缀
         * 文件名称问题可阅读源码:
         *    @see MessageSourceAutoConfiguration.ResourceBundleCondition
         */
        messageSource.setBasenames("i18n/messages");
        // 设置读取配置文件的默认编码
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    /**
     *
     * 定义解析何种文件
     *      这里配置的是解析带有_zh_CN的properties文件
     * @return
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
        return slr;
    }

}
View Code
复制代码

4、获取value的工具类

复制代码
package com.snails.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Locale;

/**
 * @ClassName MessagesUtil
 * @Description 获取Messages消息的工具类
 * @Author snails
 * @Date 2020/9/12 14:22
 * @Version 1.0
 */
@Component
public class SnailsMessagesUtil {
    // 依赖注入ResourceBundleMessageSource
    @Autowired
    private MessageSource messageSource;
    // 定义静态变量
    private static MessageSource source;

    /**
     * @PostConstruct注解:
     *   1. @PostConstruct注解的方法在依赖注入完成之后,会被自动的调用
     *   2. 执行顺序
     *      @Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注解方法)
     */
    // 初始化静态变量source
    @PostConstruct
    public void init(){
        source = messageSource;
    }

    /**
     * 根据配置文件中的key,获取value信息
     * @param key 文件中定义的key
     * @return
     */
    public static String getMessage(String key){
        Locale locale = LocaleContextHolder.getLocale();
        return source.getMessage(key, null, locale);
    }

}
View Code
复制代码

5、类路径下的 i18n/messages_zh_CN.properties 新建内容如下

5.1、messages_zh_CN.properties文件需为Resource Bundle类型

5.2、messages_zh_CN.properties文件内容

 

 

 6、启动类

复制代码
package com.snails;

import com.snails.util.SnailsMessagesUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @ClassName SnailsMessagesApplication
 * @Description 国际化配置启动类
 * @Author snails
 * @Date 2020/9/12 10:48
 * @Version 1.0
 */
@SpringBootApplication
public class SnailsMessagesApplication {

    public static void main(String[] args) {
        SpringApplication.run(SnailsMessagesApplication.class, args);
        String hello = SnailsMessagesUtil.getMessage("hello");
        System.out.println(hello);
    }
}
View Code
复制代码

7、运行结果

 

 二、Spring配置国际化(xml的配置方式)

1、目录结构

 

 2、beans.xml文件内容

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--定义messageSource-->
        <bean id="messageSource"
              class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basenames">
                <!--定义文件位置和文件名称前缀
                        文件位置:类路径下
                        文件前缀:messages
                -->
                <list>
                    <value>messages</value>
                </list>
            </property>
            <!--定义默认编码-->
            <property name="defaultEncoding" value="UTF-8"/>
        </bean>

</beans>
View Code
复制代码

3、messages.properties内容

 

 4、测试类

复制代码
package com.snails.spring;

import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Locale;

/**
 * @ClassName Test
 * @Description 测试Spring国际化配置
 * @Author snails
 * @Date 2020/9/12 15:01
 * @Version 1.0
 */
public class Test {

    public static void main(String[] args) {
        MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
        String message = resources.getMessage("hello", null, "Default", Locale.ENGLISH);
        System.out.println(message);
    }

}
View Code
复制代码

5、测试结果

 

   以上就是学习时的两个简单的demo,特此记录。

posted @   无虑的小猪  阅读(711)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示

目录在这里