从.properties文件

时间:2015-10-01 06:57:47

标签: java xml spring spring-mvc properties-file

我正在尝试将项目的字符串/消息存储在外部.properties文件中。我想我已经把所有东西都搞定了,但我还是得到了:

org.springframework.context.NoSuchMessageException: No message found under code 'subtype.user.client' for locale 'null'.

每当我尝试:

String string = messageSource.getMessage("subtype.user.client", null, null);

我的spring xml配置文件如下。由于项目非常庞大,有很多bean,我有不同的spring xml配置文件定义了不同类型的bean,还有一个主spring.config.xml文件将它们连接在一起。

名为messages.subtypes

的消息文件
subtype.user.user=User
subtype.user.client=Client props
subtype.user.staff=Staff
subtype.user.clerk=Clerk
subtype.user.secretary=Secretary

消息bean文件名为spring.messages.config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

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

    <bean id="myProjectLangs" class="myprojectbase.MyProjectLangs">
        <property name="messageSource" ref="messageSource"></property>
    </bean>

</beans>

通过spring.config.xml

将所有bean连接在一起的主<import resource="classpath:filename.xml"/>配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd 
  http://www.springframework.org/schema/aop 
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

    <aop:aspectj-autoproxy />

    <import resource="classpath:spring.messages.config.xml"/>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" />

    <context:annotation-config />
    <context:component-scan base-package="myprojectbase"/>

</beans>

3 个答案:

答案 0 :(得分:2)

您收到此错误是因为您将Locale参数作为null传递。尝试

String string = messageSource.getMessage("subtype.user.client", null, Locale.ENGLISH);

即使您尚未定义文件messages.subtypes_en.properties,也应该回退到messages.subtypes.properties

答案 1 :(得分:1)

我们会想到一些可能导致问题的代码:

  • 您的xml配置名称包含“。”作为分隔符。这违反了惯例。考虑将配置文件重命名为spring-messages-config.xml
  • 您的语言属性文件没有属性后缀,再次约定建议将此文件命名为messages-subtypes.properties
  • 在两个应用程序上下文xml文件中,您都定义了一个名为messageSource的bean。考虑删除其中一个。
  • 我怀疑您的代码无效的原因在于您在basename上定义ReloadableResourceBundleMessageSource的方式。查看用于setBasename方法的JavaDoc,有一些形式的配置约定:
  

设置单个基本名称,遵循未指定文件扩展名或语言代码的基本ResourceBundle约定,但与引用Spring资源位置的{@link ResourceBundleMessageSource}相反:用于“WEB-INF / messages.properties”,“WEB-INF / messages_en.properties”等的“WEB-INF / messages”。还支持XML属性文件:.g。 “WEB-INF / messages”也会查找并加载“WEB-INF / messages.xml”,“WEB-INF / messages_en.xml”等。

这表明,一旦将消息属性文件重命名为messages-subtypes.properties,就应该将配置更改为<value>classpath:messages-subtypes</value>,确保该文件位于类路径中,一切都应该开始工作。

答案 2 :(得分:0)

尝试将4m 24d文件重命名为messages.subtypes