1

現在、Websphere で提供されている Emitter クラス (Java2WSDL ツールと同じ) を使用して、Java ソースから JAX-RPC Web サービスを生成しようとしています。現在、テスト用に WAS6.1 と WAS7.0 を使用しています。問題は、'FooRequest' の WSDL を生成しようとしたときに、ComplexType 'Foo' に wsdl の定義から Bar[] が欠落していることです。「FooRequest」を変更して Bar[] を返すと、wsdl が正しく生成され、すべて問題ありません。

wsdl で配列が正しく生成されないのはなぜですか?
私が間違っていることはありますか?
配列を使用して wsdl を生成する正しい方法は何ですか?


Foo.Java

package test;

import com.ibm.ws.webservices.wsdl.fromJava.Emitter;

public class Foo {

    private Bar[] bars;

    private Bar bar;

    private String[] data;

    public Bar[] getBars() {
        return bars;
    }

    public void setBars(Bar[] bars) {
        this.bars = bars;
    }

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }

    public String[] getData() {
        return data;
    }

    public void setData(String[] data) {
        this.data = data;
    }

    public static void main(String[] args) {
        Emitter parser = new Emitter();

        parser.setCls("test.FooRequest");
        parser.setLocationUrl("http://localhost:8080/services/doFooService");

        // Set style/use
        parser.setStyle("document");
        parser.setUse("literal");

        parser.setIntfNamespace("urn:doFooService");
        parser.setClasspath("C:\\temp\\foo");

        parser.setWrapped(true);

        // Generate WSDL
        try {
            parser.emit("C:\\temp\\foo\\Foo.wsdl");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Bar.java

package test;

public class Bar {

    private String baz;

    public String getBaz() {
        return baz;
    }

    public void setBaz(String baz) {
        this.baz = baz;
    }
}

FooRequest.java

package test;

public class FooRequest {

    public Foo getFoo(String input) {
        Foo foo = new Foo();
        Bar[] bars = new Bar[5];
        Bar bar;
        for (int i = 0; i < bars.length; i++) {
            bar = new Bar();
            bar.setBaz("baz:" + (i + 1));
            bars[i] = bar;
        }
        foo.setBars(bars);
        bar = new Bar();
        bar.setBaz("Power Bar");
        foo.setBar(bar);

        String[] data = new String[5];
        for (int i = 0; i < data.length; i++) {
            data[i] = "baz:" + (i + 1);
        }
        return foo;
    }
}

Foo.wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:impl="urn:doFooService" xmlns:intf="urn:doFooService" xmlns:tns1="http://test" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:doFooService">
    <wsdl:types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:doFooService">
            <import namespace="http://test" />
            <element name="getFooResponse">
                <complexType>
                    <sequence>
                        <element name="getFooReturn" nillable="true" type="tns1:Foo" />
                    </sequence>
                </complexType>
            </element>
            <element name="getFoo">
                <complexType>
                    <sequence>
                        <element name="input" nillable="true" type="xsd:string" />
                    </sequence>
                </complexType>
            </element>
        </schema>
        <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test">
            <complexType name="Foo">
                <sequence>
                    <element name="bar" nillable="true" type="tns1:Bar" />
                </sequence>
            </complexType>
            <complexType name="Bar">
                <sequence>
                    <element name="baz" nillable="true" type="xsd:string" />
                </sequence>
            </complexType>
        </schema>
    </wsdl:types>
    <wsdl:message name="getFooResponse">
        <wsdl:part element="impl:getFooResponse" name="parameters" />
    </wsdl:message>
    <wsdl:message name="getFooRequest">
        <wsdl:part element="impl:getFoo" name="parameters" />
    </wsdl:message>
    <wsdl:portType name="FooRequest">
        <wsdl:operation name="getFoo">
            <wsdl:input message="impl:getFooRequest" name="getFooRequest" />
            <wsdl:output message="impl:getFooResponse" name="getFooResponse" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="doFooServiceSoapBinding" type="impl:FooRequest">
        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getFoo">
            <wsdlsoap:operation soapAction="" />
            <wsdl:input name="getFooRequest">
                <wsdlsoap:body use="literal" />
            </wsdl:input>
            <wsdl:output name="getFooResponse">
                <wsdlsoap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="FooRequestService">
        <wsdl:port binding="impl:doFooServiceSoapBinding" name="doFooService">
            <wsdlsoap:address location="http://localhost:8080/services/doFooService" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
4

1 に答える 1

-1

将来誰かがこの質問を見つけた場合に備えて、解決策を見つけました。

問題は、古い websphere 6.1 のインストールから以前に jar を取得していたことです。

  • ブートストラップ.jar
  • クラスローダー.jar
  • emf.jar
  • ffdc.jar
  • j2ee.jar
  • ras.jar
  • wccm_base.jar
  • webserverices.jar
  • wsdl4j.jar
  • wsexception.jar

これらの jar は、バージョン番号もメタデータも形式もなしに、未知の他の人から渡されました。それらがそのままの本当のリリースであるかどうかはわかりませんが、機能します。最初は提供された websphere 6.1 JRE (java 1.5) でそれらを使用していましたが、現在 websphere 7.0 にデプロイしているため、ソフトウェアを websphere 7.0 (java 1.6) を使用するように変更しました。私が気付いていなかったのは、jar と Java 1.5 リリースが互いに固有のものであるため、Java 1.6 JRE を使用する場合、Emitter クラスは失敗せず、単純に間違った wsdl を生成するということです。

これを修正するために、jar を修正する時間ができるまで、Java 1.5 JRE を使用するようにソフトウェアを元に戻しました。

于 2013-02-04T01:00:15.813 に答える