2017-03-23 1 views
0

ResourceBundleMessageSourceからReloadableResourceBundleMessageSourceに変更されています。NoSuchMessageException - Spring ReloadableResourceBundleMessageSource

私はapp-dispatcher-servlet.xmlをReloadableResourceBundleMessageSourceの要件を反映するように変更しました。 <value>com.app.properties.windows</value>から<value>classpath:windows</value>までですが、私はNoSuchMEssageExceptionになります。私はそれが私のプロパティファイルを置く場所と関係があると思っています。あるいは、私はそれを正しくリンクしていません。

ドク:

これは、ファイルの拡張子や言語コードを指定していないの基本的なのResourceBundleルール に従うが、 に(代わりに リソースをクラスパスに制限されるの)いずれかの春のリソースの場所を参照することができます。 "classpath:"接頭辞を使用すると、リソースは引き続きクラスパスから にロードできますが、 "-1"以外の "cacheSeconds"値(キャッシュ は永久にキャッシュされます)がこの場合確実に機能しない可能性があります。以下は

Folder structure messages_en_US.properties

NotBlank.book.name = Enter something don't be lazy 

アプリ-ディスパッチャ-servlet.xml

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>classpath:messages</value> 
      <value>classpath:windows</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 

</bean> 

// some i18n and localization bean 

スタックトレース

....私が持っているものです

org.springframework.web.util.NestedServletException:要求 処理に失敗しました。ネストされた例外は org.springframework.context.NoSuchMessageExceptionです:メッセージが見つかりません ロケール 'zh_CN'のコード 'Size.book.ispn'の下にあります。 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) javax.servlet.http.HttpServlet.service(HttpServletをorg.apache.tomcat.websocket。)。 server.WsFilter.doFilter(WsFilter.java:52) 根本原因

org.springframework.context.NoSuchMessageException:いいえメッセージはロケールのコード 'Size.book.ispn' 'zh_CNに' 下 は認められませんでした。 org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:159) com.app.controller.spaController.pageSpa(spaController.java:54) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) 日.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) org.springframework。 web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) org.springframework.web.servlet.mvc.method。アノタ.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) org。springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743) 組織。 (org.springframework.web.servlet.DervatServlet)。 doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) のjavax.servlet .http.HttpServ (HttpServlet.java:729) .tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

public class someController(){ 
@autowired 
private MEssageSource messageSource; 

public String pageSpa(Model model){ 
    System.out.println("loading index page"); 

    //System.out.println(((CustomMessageSource) messageSource).listMessageProperties("book", locale)); 
    Locale locale = LocaleContextHolder.getLocale(); 
    System.out.println(messageSource.getMessage("NotBlank.book.name", null, locale)); 

    return "spa"; 
} 

ありがとうございました私の作品は何

+0

スタックトレースとメッセージを読み取るコードを共有することができます –

+0

スタックトレースを追加しました –

+0

メッセージリソースファイルをWEB-INF下のリソースフォルダに配置する必要があります。 – VPK

答えて

0

:電子ファイル

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>WEB-INF/messages</value> 
      <value>WEB-INF/windows</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 
    <property name="cacheSeconds"> 
     <value>1</value> 
    </property> 
</bean> 

を、次のような構成が、私はマニュアルに示されているようにクラスパスプレフィックスを使用しようとしたが、それは

も参照してください動作しませんでした変更

WEB-INFの下で私がやることはこれです。

<bean id="messageSource" 
    class="com.app.service.CustomMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>classpath:com/app/properties/messages</value> 
      <value>classpath:com/app/properties/windows</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 

</bean> 

S inceクラスパス:WEB-INF/classを含んでいます。私は実際にプロパティファイルに実際のクラスパスを明示的に含めました。

ドキュメントに従うのがなぜうまくいかないのか分かりません。しかし、これは私のために働いた。これが苦しみの日から他の人を助けてくれることを願っています

1

がある実行するコードをコントローラにされますあなたのメッセージを移動する: Reloading of properties file which is loaded using setBundle

+0

ありがとう...私はこれを試してみましょう..もし私が間違っていればクラスパス:WEB-INF/classが含まれています。これは正しいです?私はなぜそれが動作していないのかわかりません.... –

+0

クラスパスにはWEB-INF/classが含まれています。一般的に私はクラスパスを使用することに失敗しました:しかし、私はWEB-INFだけがTomcatのリロードベールだと思う –

関連する問題