2016-10-06 7 views
1

Я попытался использовать Mkyong's guide для доступа к внешнему файлу свойств без каких-либо успехов.Spring ReloadableResourceBundleMessageSource bean не может найти внешние свойства

Это мое определение компонента в файле веб-OSGi-context.xml, расположенной в WEB-INF:

<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; 

Попытка извлечь сообщение, как это:

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

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

у меня есть messages_en_US.properties файлы как C:/тест/сообщений и C:/тестовые папки. Они содержат следующую строку:

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) 

Кстати, я также пробовал внутренние свойства, также безуспешно. Я развертываю свой .war в своем локальном servicemix (6.1.1), я также использую калитки (6.24.0) и spring (3.2.14). Запуск приложения mkyong (который не является веб-приложением) локально (без его развертывания на моей локальной службе servicemix).

+0

Так что это проблема ServiceMix. Я бы добавил его в теги и надеюсь, что кто-то с опытом ServiceMix поможет. –

+0

Ну, я думаю, это в основном потому, что это веб-приложение, а не просто приложение для строк. Не тестировали подход mkyongs локально в веб-приложении. – SSV

ответ

1

Sooo Я несколько нашел эту проблему и получил 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, но любой вызов метода на этом прокси-сервере делегируется реальному компоненту. Таким образом, реальный компонент логики находит сообщение, а не прокси. Также местоположение является корнем пути к классам, поэтому на самом деле не имеет значения, какой класс используется. –

+0

Как я и предложил в комментариях к вопросу: проблема в ServiceMix. Это основанные на OSGi и classpaths и загрузчики классов ведут себя по-другому, чем на обычном веб-сервере сервлета. –

+0

Если нет разницы между тем, какой из них используется, то почему второй работает для меня, а во-первых, нет? – SSV

Смежные вопросы