2016-10-06 31 views
1

Mkyong's guideを使用して、外部プロパティー・ファイルにアクセスしようとしましたが、成功しません。Spring ReloadableResourceBundleMessageSource beanが外部プロパティーを見つけることができません

これはWEB-INFにあるウェブのOSGi-context.xmlファイル内の私のBean定義です:

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
    <list> 
     <value>classpath:bundles/resource</value> 
     <value>classpath:bundles/override</value> 
     <value>file:c:/test/messages</value> 
    </list> 
    </property> 
    <property name="cacheSeconds" value="10"/>  
</bean> 

豆のアクセス:このようなメッセージを抽出しようとすると

@SpringBean 
private ReloadableResourceBundleMessageSource messageSource; 

を: /テスト/メッセージとC:/テストフォルダー

String name = messageSource.getMessage("customer.name", 
     new Object[] { 28,"http://www.mkyong.com" }, Locale.US); 

System.out.println("Customer name (English) : " + name); 

は、私は両方のCでmessages_en_US.propertiesファイルを持っています。それらは次の行を含んでいます:

customer.name=Test, age : {0}, URL : {1} 

これは私が持っているすべてですが、何か不足していますか?私が得るメッセージは次の通りです。

org.springframework.context.NoSuchMessageException: No message found under code 'customer.name' for locale 'en_US'. 
at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:155) 

Btw、私はまた、成功もなしに内部特性を試しました。私のローカルサービス(6.1.1)に私の.warを配備し、ウィケット(6.24.0)と春(3.2.14)も使用します。 mkyongのアプリケーション(Webアプリケーションではありません)をローカルで(ローカルのサービスに展開することなく)実行します。

+0

だから、問題はServiceMixだと思われます。私はタグでそれを追加し、ServiceMixの経験を持つ人が助けてくれることを願っています。 –

+0

まあ、私はそれが主にWebアプリケーションなので、単に文字列アプリケーションだと思う。 Webアプリケーションでローカルにmkeyongをテストしていない – SSV

答えて

1

私はややこれは動作しませんでした

..問題を発見し、workaroudを得すっごく:

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename"> 
     <value>classpath:messages</value> 
    </property> 
</bean> 

、コードで:

@SpringBean 
private ReloadableResourceBundleMessageSource messageSource; 

のgetClassを(実行)上このソースを取得する

class WICKET_org.springframework.context.support.ReloadableResourceBundleMessageSource$$EnhancerByCGLIB$$852b0c02 

しかし、これが働いている:

@Bean 
public MessageSource messageSource() { 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("classpath:messages"); 
    return messageSource; 
} 

このソースにはgetClass()を実行することにより、私は

class org.springframework.context.support.ReloadableResourceBundleMessageSource 

を取得するには、CGLIBエンハンサーはここthigsをめちゃくちゃにされている可能性がそれですか?私は最初のオプションをそれを知って働かせることができますどのような方法ですか?

+0

WicketはCGlibを​​使用してSpring Beanの周囲にプロキシを作成しますが、そのプロキシのメソッド呼び出しはすべて実際のBeanに委譲されます。したがって、実際のBeanはプロキシではなくメッセージを見つけるロジックを行います。また、場所はクラスパスのルートであるため、どのクラスが使用されているかは実際問題ではありません。 –

+0

質問のコメントで提案したとおり、問題はServiceMixです。それはOSGiベースであり、クラスパスとクラスローダーは通常のサーブレットWebサーバーとは異なる動作をします。 –

+0

どちらが使用されているかに違いがなければ、なぜ2番目のものが私のために働くのですか? – SSV

関連する問題