Внедрить DAO в Службу CXF
Я пытаюсь внедрить DAO в Службу CXF. Для этой цели я использую конфигурацию xml.
В моем приложении-сервлете.xml я добавил следующую запись:
<bean id="blogService" class="blog.BlogEntriesImpl">
<property name="blogDao" ref="blogDao" />
</bean>
Боб BlogDao также определен в этом файле.
Сервис настроен в другом xml-файле:
<import resource="classpath:META-INF/cxf/cxf.xml" />
<jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl"
address="/Blog1" />
BlogEntriesImpl реализует интерфейс сервиса. Он имеет атрибут dao и метод setter.
Я отладил приложение и обнаружил, что один экземпляр BlogEntriesImpl является инстанцируется на старте и имеет атрибут dao. Я бы сказал, что это делается с помощью конфигурации bean из app-сервлета.XML.
Однако, когда я вызываю службу, возникает исключение NullPointerException. Вот еще один пример использования BlogEntriesImpl.
, чтобы решить проблему, я объявил атрибут Дао в класс реализации сервиса (BlogEntriesImpl) как статические. Переменная устанавливается при запуске приложения. Но мне не нравится это решение.
Есть ли лучший способ внедрить dao в службу CXF?
Заранее благодарю вас!
1 ответ:
Вы правы, на самом деле существует два экземпляра вашего класса
BlogEntriesImpl
, один из которых создан Spring, а другой-Apache CXF. Вы должны явно попросить Apache CXF использовать Spring bean вместо предоставления класса. Проверьте написание сервиса с Spring , похоже, вам придется заменить:<jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl" address="/Blog1" />
С:
<jaxws:endpoint id="blogService" implementor="#blogService" address="/Blog1" />
Если Apache CXF не может найти боб с именем
blogService
, рассмотрите возможность его перемещения в основной контекст из контекста Spring MVC (app-servlet.xml
).