MessageSource и PropertyPlaceholderConfigurer не могут загружать сообщения, но с classpath * - PullRequest
2 голосов
/ 27 сентября 2011

Мое applicationContext.xml находится в пути:

src/main/resources/META-INF/spring

и файлы свойств находятся в пути:

src/main/resources/messages

и я загружаю контекст весны в web.xml следующим образом:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:META-INF/spring/applicationContext.xml</param-value>
</context-param>

при настройке источника сообщений и PropertyPlaceholderConfigurer следующим образом:

<bean id="propertyPlaceholderConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:messages/apps.properties</value>        
        </list>
    </property>
</bean>

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

они оба не работают, это работает только когда я меняю classpath на classpath* Есть идеи почему?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

С Документация Spring :

4.7.2.2 Строка пути к классу *: префикс

[...] может использовать специальную classpath*:префикс: [...]

Этот специальный префикс указывает, что все ресурсы пути к классам, соответствующие данному имени, должны быть получены [...], , а затем объединены для формирования окончательного контекста приложения.определение.

Вы уверены, что на вашем CLASSPATH нет других файлов messages/apps.properties, которые по совпадению имеют приоритет и переопределяют ваш файл?Это описание предполагает, что у вас может быть несколько файлов с одинаковыми именами, которые объединяются при использовании *.

Вы можете проверить это, позвонив по номеру:

SomeClass.class.getClassLoader().getResources("/messages/apps.properties");

?

2 голосов
/ 07 октября 2011

Посмотрите на эту превосходную статью для classpath v classpth * Разница в отношении весенней загрузки ресурсов. Я провел некоторое тестирование вашей проблемы, в моем тестировании она работала независимо от того, использовал ли я classpath или classpath *

Я перечисляю здесь код о тесте, который я сделал

  • Я создал эту структуру каталогов (META-INF / spring в src / main / resource), поместил context.xml
  • Я перечисляю полный context.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"
            xsi:schemaLocation="http://www.springframework.org/schema/beans                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
       <bean id="propertyPlaceholderConfigurer"
                 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:messages/apps.properties</value>
            </list>
        </property>
      </bean>
    
        <bean class="prasanna.service.TestBean">
           <property name="appName" value="${appname}"></property>
         </bean>
    
    <bean id="messageSource"  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
         <list>
           <value>classpath:messages/ValidationMessages</value>
               <value>classpath:messages/apps</value>
           </list>
       </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>
        </beans>
    
  • Листинг для apps.properties

     appname=spring mvc app
    
  • Листинг для ValidationMessages.properties

      error.name=Invalid name
    
  • TestBean довольно прост

        public class TestBean 
        {
            private String appName;
    
            public String getAppName() {
                return appName;
            }
    
            public void setAppName(String appName) {
                this.appName = appName;
            }
    
        }
    
  • Я использую простой класс Java для загрузки файлов свойств и чтенияих

    public class LoadContext 
    {
        public static void main(String[] args) 
        {
            ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"classpath:META-INF/spring/context.xml"});
            ReloadableResourceBundleMessageSource msgs = ctx.getBean(ReloadableResourceBundleMessageSource.class);
    
                  TestBean testBean = ctx.getBean(TestBean.class);
        Assert.assertTrue(testBean.getAppName().equals("spring mvc app"));
    
            String msg = msgs.getMessage("appname", new Object[]{new DefaultMessageSourceResolvable("appname")}, null);
            System.out.println(" "+ msg);
    
            String msg2 = msgs.getMessage("error.name", new Object[]{new DefaultMessageSourceResolvable("error.name")}, null);
            System.out.println(" "+ msg2);
        }
    
    }
    
...