java - 通过 Spring Framework 中的注释从 resourceBundle 获取本地化消息

标签 java spring localization annotations resourcebundle

可以这样做吗?目前是这样完成的:

<bean id="resource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>content.Language</value> 
        </list>
    </property>
</bean>

@Autowired
protected MessageSource resource;

protected String getMessage(String code, Object[] object, Locale locale) {
    return resource.getMessage(code, object, locale);
}

有没有办法像通过@Value 注解获取属性一样?

<util:properties id="generals" location="classpath:portlet.properties" />

    @Value("#{generals['supported.lang.codes']}")
    public String langCodes;

因为必须调用该方法通常很好,但是例如在单元测试时,这很痛苦……在某些情况下,对象没有初始化的webdriver的PageObject模式,这将是真的很有帮助

最佳答案

我相信你混淆了两个概念:

  • 属性文件
  • 消息资源包

属性文件包含属性(与语言环境无关)。在 Spring 中,它们可以通过 util:properties 加载。并可用于@Value注释。

但是消息资源包(基于看起来像属性文件的文件)依赖于语言。在 Spring 中,您可以通过 org.springframework.context.support.ResourceBundleMessageSource 加载它们。 .但不要通过 @Value 注入(inject)字符串.您不能注入(inject)它们,因为 @Value每个 bean 注入(inject)一次,@Value将被评估一次(大多数在开始时),并且计算的值将被注入(inject)。但这不是您在使用消息资源包时通常需要的。因为你需要在每次使用变量时评估值,具体取决于用户的语言。


但你可以自己轻松构建它!

你唯一需要的就是这个类:

import java.util.Locale;    
import javax.annotation.Resource;    
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

@Configurable
public class MSG {

    private String key;

    @Resource(name = "messageSource")
    private MessageSource messageSource;

    public MSG(String key) {
        super();
        this.key = key;        
    }

    public String value() {
        Locale locale = LocaleContextHolder.getLocale();                        
        return messageSource.getMessage(key, new Object[0], locale);
    }

    @Override
    public String toString() {
        return value();
    }
}

那么就可以这样使用了:

@Service
public class Demo {

    @Value("demo.output.hallo")
    private MSG hallo;

    @Value("demo.output.world")
    private MSG world;

    public void demo(){
        System.out.println("demo: " + hello + " " + world);
    }    
}

要使其运行,您需要启用 <context:spring-configured />打开 AspectJ @Configurable 支持,并且(这很重要)您需要在相同的应用程序上下文中实例化 Ressouce Bundle 消息源(例如,在 Web 应用程序中,您在大多数情况下将 ReloadableResourceBundleMessageSource 定义放在 Web 应用程序上下文中,但这在这种情况下不起作用,因为 MSG 对象位于“正常”应用程序上下文中。

关于java - 通过 Spring Framework 中的注释从 resourceBundle 获取本地化消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246381/

相关文章:

android - Android 中的加泰罗尼亚语和巴斯克语资源

html - 根据区域设置设置单个样式表

java - 在服务类中启用 JSR-303 注释验证(不在 Spring Controller 中,也不在 JAX-RS 资源中)

java - Libgdx 角色运行动画未显示

java - 如何在 Spring 上下文中插入 Maven 配置文件属性

java - Controller 和 validator 的范围

java - 友好的 URL 映射问题 - Java Spring

java - 如何使用 JavaFX 和 Gradle 更改工作目录?

java - Spring Boot 部署失败,Weblogic 10.3.4.0 中出现 StackoverflowError

c# 在将字符串移动到资源以进行本地化时如何处理换行符?