Первая служба кода CXF, генерация WSDL;мыло: адрес меняется? - PullRequest
1 голос
/ 22 декабря 2010

У меня есть простой Java-интерфейс / реализация, которую я представляю через CXF. У меня есть элемент jaxws в моем конфигурационном файле Spring, например:

<jaxws:endpoint id="managementServiceJaxws"
            implementor="#managementService" address="/jaxws/ManagementService" >
</jaxws:endpoint>

Он генерирует WSDL из моего аннотированного интерфейса и предоставляет сервис. Затем, когда я нажимаю http://myhostname/cxf/jaxws/ManagementService?wsdl, я получаю прекрасный WSDL. Внизу в элементе wsdl: service я посмотрю

<soap:address location="http://myhostname/cxf/jaxws/ManagementService"/>

Однако, через некоторое время или около того, без перезапуска приложения, нажатие на тот же самый URL приводит к:

<soap:address location="http://localhost/cxf/jaxws/ManagementService"/>

Это вызывает ряд проблем, но я действительно хочу это исправить. Прямо сейчас есть определенный клиент для веб-сервиса, который устанавливает конечную точку в localhost; потому что он работает на той же машине. Возможно ли, что wsdl регенерируется и кэшируется, а затем выставляет версию 'localhost'? Частично я не знаю точный механизм, с помощью которого можно перейти от запроса? Wsdl в CXF к ответу. Кажется почти уверенным, что он извлекает какую-то кэшированную версию, учитывая, что он должен определять адрес, задавая сервлет-контейнер (Jetty).

Для справки: я знаю, что решение с ограничением по времени использует имя хоста на клиенте и следит за тем, чтобы псевдоним был на месте, чтобы он проходил через петлю.

EDIT: Для справки, я подтвердил, что если я запускаю свое приложение и сначала нажимаю на него через localhost, то при запросе wsdl через имя хоста адрес отображается как localhost. И наоборот, первое попадание по имени хоста заставляет запросы localhost показывать имя хоста. Очевидно, что здесь что-то кешируется.

EDIT2: Я думаю, что проблема может быть в OsgiServletController, так как есть метод:

    private synchronized void updateDests(HttpServletRequest request) {
    if (disableAddressUpdates) {
        return;
    } //snip

Но я не вижу способа подтвердить, что проблема в том, что это логическое значение установлено в true или как я мог бы его обновить!

Ответы [ 2 ]

0 голосов
/ 17 мая 2016

Biju,

Ваш ответ кажется правильным. Тем не менее, порядок кажется неправильным. Тег load-on-startup должен стоять в последней строке, иначе он показывает ошибку в Eclipse.

<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>
        org.apache.cxf.transport.servlet.CXFServlet
    </servlet-class>
    <init-param>
        <param-name>disable-address-updates</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
0 голосов
/ 04 января 2011

Не могли бы вы подтвердить версию CXF, которую вы используете - я не вижу такого поведения при кэшировании с версией, которую я имею - 2.3.1.

URL-адрес службы определяется на основе URL-адреса, используемого клиентом для запроса (в основном с использованием httpRequest.getRequestURL), если в теге конечной точки, указанном выше, не указан явный атрибут publEndpointUrl.

Редактировать: Странно, звучит так, будто ваш EDIT 2 может быть в правильном направлении, что касается настройки «disable-address-updates», попробуйте инициализировать CXFServlet таким образом в файле web.xml и посмотрите, поможет ли это:

    <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>
        org.apache.cxf.transport.servlet.CXFServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
        <param-name>disable-address-updates</param-name>
        <param-value>false</param-value>
    </init-param>
</servlet>
...