#java #spring
#java #весна
Вопрос:
Для компонентов обычно мы можем настроить атрибут id, но для класса ResourceBundleMessageSource, если мы не указываем id=»MessageSource», тогда генерируется исключение.
<bean id="myMessageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message" />
</bean>
Он выдает исключение
Exception in thread "main" org.springframework.context.NoSuchMessageException:
для кода
new ClassPathXmlApplicationContext("springconfig.xml").getMessage("code");
Комментарии:
1. Хороший вопрос, из-за которого я несколько часов дергал себя за волосы!
Ответ №1:
Короткий ответ — потому что так они его разработали.
Как описано в справочном руководстве:
Когда
ApplicationContext
загружается, он автоматически выполняет поискMessageSource
компонента, определенного в контексте. Компонент должен иметь имяmessageSource
.Если такой компонент найден, все вызовы предыдущих методов делегируются источнику сообщения…. ЕслиApplicationContext
не удается найти какой-либо источник для сообщений,DelegatingMessageSource
создается экземпляр empty, чтобы иметь возможность принимать вызовы методов, определенных выше.
Это просто жестко запрограммированное значение, которое ищется. Если вы не предоставите компонент с этим именем, вы получите DelegatingMessageSource
экземпляр, который не разрешит ни одно из ваших сообщений, предоставляя вам NoSuchMessageException
.
Ответ №2:
Выдержка из документации:
Когда загружается ApplicationContext, он автоматически выполняет поиск компонента MessageSource, определенного в контексте. Компонент должен иметь имя MessageSource. Если такой компонент найден, все вызовы предыдущих методов делегируются источнику сообщения. Если источник сообщения не найден, ApplicationContext пытается найти родительский компонент, содержащий компонент с тем же именем. Если это так, он использует этот компонент в качестве источника сообщений. Если ApplicationContext не может найти какой-либо источник для сообщений, создается экземпляр пустого DelegatingMessageSource, чтобы иметь возможность принимать вызовы методов, определенных выше.