在Spring Bean中注入ResourceBundle

4

我想将资源绑定注入到一个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内置的根据语言环境读取消息包的功能,并将其视为单独的bean。

为什么要使用bundle而不是抽象了它的MessageSource呢? - M. Deinum
1
因为我需要使用ResourceBundle来填充Jasper报表,而他们的API只接受这种类型。 - MichelReap
1
MessageSource包装在MessageSourceResourceBundle中。 - M. Deinum
你能用一些代码详细说明一下吗?我不确定如何获取MessageSource对象。 - MichelReap
你已经在检索 MessageSourceResourceBundleMessageSource 是一个 MessageSource... 只需将其包装在 MessageSourceResourceBundle 中,并将其传递给 JasperReport(s)。这也是 Spring 在其自己的 JasperReports 支持中所做的。 - M. Deinum
2个回答

2

我遇到了与OP相同的情况,M. Deinum的评论建议使用MessageSourceResourceBundle包装MessageSource来解决我的问题。

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));

1

可能这个文档的一部分会有所帮助。在您的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接