2016-02-17 142 views
1

我想將一個資源包注入到一個bean中。我需要資源包,我無法直接獲取消息。我使用這個片段加載資源:在Spring Bean中注入ResourceBundle

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

然後我就可以把它注射到我的豆是這樣的:

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

但是,這給了我一個ResourceBundleMessageSource會,其中有一個getResourceBundle()方法,受到保護,因此我無法稱呼它。

I.e.我想要的是Spring的內置功能,根據語言環境讀取消息包,然後將其視爲單獨的bean。

+0

爲什麼。爲什麼你想要這個bundle而不是'MessageSource',它會將這個消息抽象出來。 –

+0

因爲我需要用一個'ResourceBundle'來提供碧玉報告,並且他們的api只接受這個 – MichelReap

+0

將'MessageSource'包裝在'MessageSourceResourceBundle'中。 –

回答

1

可能這個part of documentation會有幫助。在豆類中,您應該使用MessageSource。在控制器或服務或任何其他豆你可以用它下一個方法:

@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> 

... 

現在有關配置。我會建議你保持缺省ID爲ResourceBundleMessageSource bean。默認密碼是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

0

我碰到了與OP相同的情況,M. Deinum對MessageSourceMessageSourceResourceBundle的評論解決了我的問題。

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