【小技巧】spring-MVC在controller层获取国际化文件信息

A.MessageSource的体系结构:

这里写图片描述 
【HierarchicalMessageSource接口】 
添加了两个方法,建立父子层级的MessageSource结构。该接口的setParentMessageSource (..)方法用于设置父MessageSource,而getParentMessageSource()方法用于返回父MessageSource。

【ResourceBundleMessageSource和ReloadableResourceBundleMessageSource】 
它们基于Java的ResourceBundle基础类实现,可以通过资源名加载国际化资源。ReloadableResourceBundleMessageSource提供了定时刷新功能,允许在不重启系统的情况下,更新资源的信息。StaticMessageSource主要用于程序测试,它允许通过编程的方式提供国际化信息。而DelegatingMessageSource是为方便操作父MessageSource而提供的代理类。

使用示例

ResourceBundleMessageSource,结合了JDK中ResourceBundle和MessageFormat的功能

示例:

国际化文件:msg_en_us.properties

# 国际化文件 msg_en_us.properties
description=He is {0},He has {1,number,currency}

 controller代码示例:

ResourceBundleMessageSource source = new ResourceBundleMessageSource();
// 国际化文件地址
source.setBasename("msg");
String result=source.getMessage("description", new Object[]{19, 12.34}, Locale.US);
System.out.println(result);

// ====输出===
He is 19,He has $12.34

B.MessageSource接口定义:

public interface MessageSource {

     //code表示国际化资源中的属性名;args用于传递格式化串占位符所用的运行期参数;
     //当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;
     //locale表示本地化对象;
    String getMessage(String code, Object[] args, String defaultMessage, Locale locale);

    //与上面的方法类似,只不过在找不到资源中对应的属性名时,
    //直接抛出NoSuchMessageException异常;
    String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;

    //将属性名、参数数组以及默认信息封装起来,它的功能和第一个接口方法相同。
    String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;

}

C.封装工具类方法

import org.springframework.context.support.ResourceBundleMessageSource;

import java.util.Locale;

/**
 * 用户信息相关工具类
 *
 * @author Weijuer
 * @create 2018-01-15 11:02
 */
public class MessageSourceUtils {

    // 日志
    private static final String tag = MessageSourceUtils.class.getName();

    /**
     * 获取国际化文件中国际化字段信息
     * @param key
     * @param args
     * @return
     */
    public static String getMessageByKey(String key, Object[] args) {

        // 读取国际化文件
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        // 国际化文件位置
        messageSource.setBasename("messages");
        String result = "";

        try {
            // 获取默认国际化标识
            Locale locale = LocaleContextHolder.getLocale();
            System.out.println("locale:===>" + locale);
            LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @start $key:===>" + key);
            LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @start $locale:===>" + locale);
            // 获取国际化key-value
            result = messageSource.getMessage(key, args, "暂无国际化", locale);
            LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @end $result:===>" + result);
        } catch (Exception e) {
            e.printStackTrace();
            LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @error $error:===>" + e.getMessage());
        }

        return result;
    }

}

猜你喜欢

转载自my.oschina.net/weijuer/blog/1813462