2010-12-22 6 views
1

Ich habe eine einfache Java-Schnittstelle/Implementierung, die ich über CXF exponiere. Ich habe ein jaxws Element in meiner Spring-Konfigurationsdatei wie folgt aus:CXF-Code erster Dienst, WSDL-Generierung; soap: Adressänderungen?

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

Es die WSDL aus meiner kommentierten Schnittstelle erzeugt und macht den Dienst. Dann, wenn ich http://myhostname/cxf/jaxws/ManagementService?wsdl treffe, bekomme ich eine schöne WSDL. Am unteren Ende in der WSDL-Datei: Service-Element, werde ich

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

jedoch sehen, einige Zeit ein oder zwei Tage später, ohne Neustart der Anwendung, die gleiche URL schlagen produziert:

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

Diese verursacht eine Reihe von Problemen, aber was ich wirklich will, ist es, es zu beheben. Im Moment gibt es einen bestimmten Client für den Webservice, der den Endpunkt auf localhost setzt. weil es auf derselben Maschine läuft. Ist es möglich, dass die WSDL neu generiert und zwischengespeichert wird und dann die 'localhost' Version anzeigt? Teilweise kenne ich nicht den genauen Mechanismus, mit dem man von einer? Wsdl-Anfrage in CXF zur Antwort geht. Es scheint fast sicher zu sein, dass es eine zwischengespeicherte Version abruft, vorausgesetzt, dass es die Adresse bestimmen soll, indem man den Servletcontainer (Jetty) fragt.

Als Referenz weiß ich, eine Stopgap-Lösung verwendet den Hostnamen auf dem Client und stellt sicher, dass ein Alias ​​vorhanden ist, so dass es über den Loopback geht.

EDIT: Als Referenz habe ich bestätigt, dass, wenn ich meine Anwendung hochbringen und zuerst über localhost, dann die Abfrage für die WSDL über den Hostnamen zeigt die Adresse als localhost. Umgekehrt bewirkt das erste Drücken auf den Hostnamen, dass localhost-Anfragen den Hostnamen anzeigen. Offensichtlich wird hier etwas zwischengespeichert.

EDIT2: ich glaube, das Problem OsgiServletController sein könnte, da es eine Methode ist:

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

Aber ich sehe die Bestätigung keine Möglichkeit, dass das Problem ist, dass dieser Booleschen Wert auf true gesetzt ist oder wie ich könnte es tatsächlich aktualisieren!

Antwort

0

Können Sie bitte die Version von CXF bestätigen, die Sie verwenden - ich sehe dieses Caching-Verhalten nicht mit der Version, die ich habe - 2.3.1.

Die URL für den Dienst auf der Client-URL für die Anforderung wird bestimmt unter Verwendung basiert (im Grunde httpRequest.getRequestURL verwendet wird), es sei denn, ein explizites publishedEndpointUrl Attribut oben an den Endpunkt-Tag versehen ist.

Edit: Seltsam, klingt wie Ihr EDIT 2 könnte in die richtige Richtung sein, wie für die Einstellung "disable-Adresse-Updates", versuchen Sie, das CXFServlet auf diese Weise in Ihrer web.xml-Datei zu initialisieren und sehen, ob es hilft:

<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> 
+0

2.2.10 ist die Version, die ich verwende. – jcalvert

0

Biju,

Ihre Antwort scheint richtig. Die Reihenfolge scheint jedoch falsch zu sein. load-on-startup Tag sollte in der letzten Zeile kommen, sonst zeigt es Fehler in 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>