2 Stimmen

JAX-RPC, Spring-Webdienste und UnsupportedOperationCallException

Ich habe einen JAX-RPC-Webdienst, den ich versuche, mit Spring zu konsumieren. Dies ist das erste Mal, dass ich Spring verwende, um einen Webdienst zu konsumieren, also versuche ich im Moment nur, ihn testweise in den JAX-RPC-Webdienst zu integrieren.

Der Webdienst umfasst mehrere Dutzend Operationen, aber im Moment interessiert mich nur eine. Hier sind die Schnittstellen, die ich auf der Spring/Client-Seite erstellt habe:

public interface WSClient {
    public boolean userExists(int userid);
}

public interface WSService {
    //this method matches the method signature of the Web Service
    public com.company.data.User getUser(int userid);
}

Und hier ist meine applicationContext.xml:

<bean id="WSClient" class="com.company.ws.test.WSClientImpl">
    <property name="service" ref="myWebService"></property>
</bean>

<bean id="myWebService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
    <property name="serviceInterface" value="com.company.ws.test.WSService"/>
    <property name="endpointAddress" value="http://1.2.3.4/web-service/data"/>
    <property name="namespaceUri" value="http://www.company.com/wdsl"/>
    <property name="serviceName" value="CompanyWebService"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
    <property name="maintainSession" value="true"/>
</bean>

Mit dieser Konfiguration von JaxRpcPortProxyFactoryBean gibt der Aufruf des Dienstes die folgende Ausnahme zurück:

org.springframework.remoting.RemoteProxyFailureException: Ungültige JAX-RPC-Aufrufkonfiguration; verschachtelte Ausnahme ist Operation Style: "rpc" nicht unterstützt

Ich habe den Unterschied zwischen RPC- und dokumentenbasierten Webdiensten nie ganz verstanden; ich glaube jedoch, dass dieser Webdienst den RPC-Stil verwendet - daher verwirrt mich diese Ausnahme.

Zweitens, ich bin verwirrt, welche Eigenschaften ich mit JaxRpcPortProxyFactoryBean :

  1. Wenn ich die wsdlDocumentUrl Eigenschaft, erhalte ich am Ende einen HTTP 401-Fehler, da dieser Webdienst hinter HTTP Basic Authentication sitzt und es scheint, dass Spring die Eigenschaften Benutzername/Passwort beim Abrufen der WSDL nicht verwendet.
  2. Wenn ich eine PortInterface Eigenschaft (mit einem Wert von CompanyWebServiceInterfacePort ), dann erhalte ich eine andere Exception, die besagt:

    Dienst für JAX-RPC-Port konnte nicht initialisiert werden [{ http://www.company.com/wdsl }CompanyWebServiceInterfacePort]; verschachtelte Ausnahme: WSDL-Daten fehlen, dieser Vorgang ist nicht verfügbar

Mit anderen Worten, es sagt mir, dass die WSDL fehlt - die ich nicht einstellen kann, da Spring nicht den Benutzernamen/Passwort verwenden wird, um es vom Server zu holen!

Ich bin mir nicht sicher, ob das alles einen Sinn ergibt, aber im Grunde genommen bin ich mir unsicher:

  1. Muss ich für einen JAX-RPC-Dienst die Eigenschaft PortInterface festlegen? Ist dies der Weg, den ich einschlagen sollte?
  2. Ähnlich, braucht Spring mich, um die wsdlDocumentUrl Eigentum? Wenn ja, gibt es eine Möglichkeit, Spring die WSDL mitzuteilen und das Authentifizierungsproblem zu umgehen?

0voto

matt b Punkte 135206

Ich habe das Problem schließlich gelöst, indem ich eine Kopie der WSDL-Datei lokal gespeichert habe, und da JaxRpcPortProxyFactoryBean eine java.net.URL für die wsdlDocumentUrl Eigenschaft, musste sie mit einem Pfad wie file:///c:/.../blah.wsdl .

Das ist nicht wirklich wünschenswert, denn ich würde es hassen, wenn ich eine file:/// URI in einer Spring-Kontextdatei, die auf einem Server bereitgestellt werden könnte, insbesondere auf einer anderen Plattform - scheint seltsam, dass sich diese Klasse auf diese Weise verhält.

Ich vermute, dass die meisten Leute, die Spring nicht verwenden, sowieso nicht JAX-RPC benutzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X