Внедрить 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 4

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).