在Spring Bean中注入ResourceBundle

时间:2016-02-17 10:45:10

标签: spring

我想将资源包注入bean中。我需要资源捆绑,我无法直接获取消息。我正在使用此代码段来加载资源:

 <bean id="reportMessages" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename">
            <value>report.messages</value>
        </property>

然后我可以像这样将它注入我的bean:

@Autowired
@Qualifier("reportMessages")
private ResourceBundleMessageSource reportMessages;

但这给了我一个ResourceBundleMessageSource,它有一个受保护的getResourceBundle()方法,因此我无法调用它。

即。我想要的是Spring的内置功能,根据语言环境读取Message Bundle,然后将其视为一个单独的bean。

2 个答案:

答案 0 :(得分:1)

可能此part of documentation会有所帮助。在您的bean中,您应该使用MessageSource。在控制器,服务或任何其他bean中,您可以使用它:

@Controller
public class MyController{

    @Autowired
    private MessageSource messageSource;

    ....

    @RequestMapping("/messages")
    public String showMessages(ModelMap model) {

        String englishMessage = messageSource.getMessage("commend.message", null, 
            new Locale("en", "US"));
        String russianhMessage = messageSource.getMessage("commend.message", null, 
            new Locale("ru", "RU"));
        ...
    }
}

并且在视图中(如果您使用JSP,原因):

<div>
    <span>
        <spring:message code="commend.message"/>
    </span>
</div>

...

现在关于配置。我建议你保持ResourceBundleMessageSource bean的默认id。默认ID为messageSource

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
     <property name="basename">
          <value>report.messages</value>
     </property>
</bean>

原因是,您可以通过@Qualifier注释自动装配此bean,就像您一样。但默认情况下,大多数模板(JSP,Thymeleaf和其他)都会查找messageSource bean。因此,如果您保留默认名称,则无需更改模板引擎的设置。

不要忘记将应用程序属性文件的类路径的根目录放入每个所需语言的消息中。在此示例中,它将report.messages.properties(默认),report.messages_en_US.propertiesreport.messages_ru_RU.properties

答案 1 :(得分:0)

我遇到了和OP一样的情绪,而且,Le Deinum关于用MessageSource包裹MessageSourceResourceBundle的评论解决了我的问题。

Locale locale = Locale.getDefault();
params.put(JRParameter.REPORT_LOCALE, locale);
    /* wrap the annotated messageSource with MessageSourceResourceBundle */
params.put(JRParameter.REPORT_RESOURCE_BUNDLE, new MessageSourceResourceBundle(messageSource, locale));