在Spring 3.2中读取属性文件

时间:2013-07-28 20:24:39

标签: java spring

spring.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">  

  <bean id="meassageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="resource\message">  
    </property>
  </bean>

 </beans>

Main.java类文件

public class Main {

    public static void main(String[] args) {

        ApplicationContext context= new ClassPathXmlApplicationContext("spring.xml");

        System.out.println(context.getMessage("emp", null, Locale.US));

    }

} 

我的属性文件位于src / resource文件夹中。文件名是mesaage_en_US.properties。 我也尝试过不同的文件名,如message.property,message_en.property,以及Locale.English,Locale.UK等不同的语言环境,但没有运气。 我将属性文件移动到src文件夹但得到相同的异常。 我正在接受例外。

Exception in thread "main" org.springframework.context.NoSuchMessageException: No message found under code 'emp' for locale 'en_US'.
    at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:65)
    at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1234)
    at org.beans.Main.main(Main.java:14)

请帮忙。

message_en_US.properties

emp=Hello Employee.

5 个答案:

答案 0 :(得分:5)

我喜欢使用PropertySourcesPlaceholderConfigurerHere's a great tutorial让你开始。

基本上,您需要添加:

<context:property-placeholder location="classpath:foo.properties" />

到你的spring xml配置文件,其中“foo.properties”是类路径中资源的绝对路径。

然后你可以将它们注入这样的字段:

@Value( "${jdbc.url}" )
private String jdbcUrl;

其中“jdbc.url”是属性文件中的引用名称。

当然,@Value无法在您static void main内部使用,但我确实怀疑static void main是您想要使用您的媒体资源的地方。你应该从Spring Bean访问它们。

答案 1 :(得分:0)

更改为

<property name="basename" value="message" />

message_en_US.propertiesspring.xml放在同一文件夹中。

编辑在定义MessageSource时,您的 bean 名称中存在拼写错误。它的名字应该是messageSource。由于 meassageSource a中的额外ApplicationContext未能加载它。

答案 2 :(得分:0)

我认为这与this问题重复。基本上,它与您的bundle和代码中指定的语言环境之间的不匹配有关。

答案 3 :(得分:0)

我没有从ApllicationContext收到消息,而是从MeassageSource本身收到消息。我像这样改变了我的spring.xml

<bean id="employee" class="org.bean.Employee" >
         <property name="id" value="1"/>
         <property name="name" value=""/>
         <property name="dept" value=""/>  
         <property name="messages" ref="messageSource"/>    
      </bean>

现在我从messages.getMessage(this.messages.getMessage("emp", null, Locale.UK))班级致电Employee。它的工作。

答案 4 :(得分:0)

我已经重现了您的错误并发现了问题。这与Spring没有找到捆绑包有关。我认为您应该在异常之前收到警告,并显示以下消息:

WARNING: ResourceBundle [resource\message] not found for MessageSource: Can't find bundle for base name resource\message, locale en_US

这是暗示。问题与您的项目结构以及指定setBasename属性时如何搜索包有关。请查看this

无论如何,我认为你应该将你的捆绑包放在更标准的位置src / main / resources中。如果遵循此约定,则应定义messageSource bean,如下所示:

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

使用这种方法,您的示例应该生成所需的行:

  

Hello Employee。