1

現在、SOAP Web サービスを処理する Java アプリを開発しています。

問題は、WSDL を解析した後にあり [Apache Axis のParserオブジェクトが処理してくれます]、呼び出しを作成します。

それを呼び出そうとすると、[WSDL のアクションから取得した] パラメータを割り当てるために Object[] を渡さなければなりません。通常のアクションは簡単ですが、カスタム データ型があると、それを入力することができません。Object[]{ new Object { }} を渡そうとしましたが、代わりに最初のフィールドが割り当てられます。「< >」が「--lt --gt」に変更され、サーバーがそれを認識しないため、処理済みの状態で渡すことはできません。

これは WSDL のフラグメントです。

  <s:element name="FERecuperaQTYRequest">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="argAuth" type="tns:FEAuthRequest" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="FEAuthRequest">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Token" type="s:string" />
      <s:element minOccurs="0" maxOccurs="1" name="Sign" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="cuit" type="s:long" />
    </s:sequence>
  </s:complexType>

そしてこれが厄介なJava Fragment

        QTY = (String) call.invoke (
                new Object[]{
                     new Object[]{
                            tokenConexion.getToken (),
                            tokenConexion.getSign (),
                            tokenConexion.getCUIT ()
                                 }
                            });
4

2 に答える 2

1

Springのプロキシ機能のようなものを使用することを検討しましたか?Spring構成ファイルでWebサービスについて少し説明すると、クライアントコードで処理する必要があるのは、作成したインターフェイスだけです。反対側にWebサービスがあることを知る必要はありません。

Spring構成の例:

<bean id="myService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
    <property name="serviceFactoryClass" value="org.apache.axis.client.ServiceFactory"/>
    <property name="wsdlDocumentUrl" value="classpath://META-INF/myService.wsdl"/>
    <property name="namespaceUri" value="http://com/myService"/>
    <property name="endpointAddress" value="http://server/MyService"/>
    <property name="serviceName" value="MyService"/>
    <property name="portName" value="MyService"/>
    <property name="serviceInterface" value="com.IMyService"/>
    <property name="lookupServiceOnStartup" value="false"/>
</bean>
<bean id="myClient" class="com.MyServiceClient">
    <property name="myService" ref="myService"/>
</bean>

Java:

public interface IMyService {
    Foo getFoo();
}

public class MyServiceClient {
    private IMyService myService;
    public void setMyService(IMyService myService) {
        this.myService = myService;
    }

    public void DoStuff() {
        Foo foo = myService.getFoo();
        ...
    }
}

カスタムオブジェクトの場合、JaxRpcPortProxyFactoryBeanをサブクラス化する必要がある場合があります。

public class MyServiceFactoryBean extends JaxRpcPortProxyFactoryBean {
protected void postProcessJaxRpcService(Service service) {
    TypeMappingRegistry registry = service.getTypeMappingRegistry();
    TypeMapping mapping = registry.createTypeMapping();
            QName qName = new QName("http://com/myService", "Foo");
    mapping.register(Foo.class, qName,
            new BeanSerializerFactory(Foo.class, qName),
            new BeanDeserializerFactory(Foo.class, qName));
    }
}

私がこれについて気に入っているのは、サービスの実装を気にしないはずのコードは気にしないということです。テストは簡単になり、クラスのまとまりははるかに良くなります。

于 2008-10-30T19:33:08.490 に答える
0

複雑なオブジェクトと Axis を使用しようとしました。しないでください!Dotnet が WSDL から正しいオブジェクトを作成する際に、多くの問題がありました。プリミティブ、文字列、配列だけを使用することになりました。誰かが複雑なオブジェクトを使用する良い方法を持っているなら、私はそれを聞きたいです.

于 2008-10-30T22:26:20.310 に答える