3

既存の Soap WebServices は、.xml ファイルを指定する WSDL ファイルを提供していますxsd:struct。WebService は PHP で記述されています。

Java、Maven、Spring-ws、Axis 環境で Wsdl2Java ゴールを実行しようとすると、次のように言って失敗します。

[INFO] [axistools:wsdl2java {execution: default}]
[INFO] about to add compile source root
[INFO] Processing wsdl: /home/foobar/workspace/com.foobar/src/main/wsdl/foobar.wsdl
Sep 17, 2012 2:29:42 AM org.apache.axis.utils.JavaUtils isAttachmentSupported
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error generating Java code from WSDL.

Embedded error: Error running Axis
Type {http://www.w3.org/2001/XMLSchema}struct is referenced but not defined.

これを修正する方法はありますか?

WSDL は次のようになります。

<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://foobar.service.de/service/v2" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="Soap_Manager" targetNamespace="http://foobar.service.de/service/v2">
    <types>
        <xsd:schema targetNamespace="http://foobar.service.de/service/v2"/>
    </types>
    <portType name="Soap_ManagerPort">
        <operation name="searchFoo">
            <documentation>searchFoo</documentation>
            <input message="tns:searchFooIn"/>
            <output message="tns:searchFooOut"/>
        </operation>
    </portType>
    <binding name="Soap_ManagerBinding" type="tns:Soap_ManagerPort">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="searchFoo">
            <soap:operation soapAction="http://foobar.service.de/service/v2#searchFoo"/>
            <input>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://foobar.service.de/service/v2"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://foobar.service.de/service/v2"/>
            </output>
        </operation>
    </binding>
    <service name="Soap_ManagerService">
        <port name="Soap_ManagerPort" binding="tns:Soap_ManagerBinding">
            <soap:address location="http://foobar.service.de/service/v2"/>
        </port>
    </service>
    <message name="searchFooIn">
        <part name="param" type="xsd:struct"/>
    </message>
    <message name="searchFooOut">
        <part name="return" type="xsd:struct"/>
    </message>
</definitions>

ご協力いただきありがとうございます。

編集1:

このリファレンスは次のように述べて います。...It's xsd:struct, which means it should be treated as an array with multiple values. Most languages render xsd:struct types as hashes with a key => value notation....

しかし、Apache Axis でこれを行うにはどうすればよいでしょうか?

編集2:

これは現在の pom.xml です

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
...
    <build>
        <plugins>
...
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>axistools-maven-plugin</artifactId>
                <version>1.4</version>
                <configuration>
                    <urls>
                        <url>http://foobar.service.de/wsdlv2.wsdl</url>
                    </urls>
                    <packageSpace>com.foobar.wsdl</packageSpace>
                    <testCases>true</testCases>
                    <serverSide>true</serverSide>
                    <subPackageByFileName>true</subPackageByFileName>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>

                <dependencies>      
                    <dependency>
                        <groupId>javax.activation</groupId>
                        <artifactId>activation</artifactId>
                        <version>1.1.1</version>
                    </dependency>

                    <dependency>
                        <groupId>javax.mail</groupId>
                        <artifactId>mail</artifactId>
                        <version>1.4.5</version>
                    </dependency>
                </dependencies>

            </plugin>

        </plugins>
...
    </build>
...

編集3:

有効な Soap Request は次のようになります (ドキュメントから取得し、soap-ui でテストしました)。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:emn="interface.foobar">
<soap:Header/>
<soap:Body>
    <emn:searchFoobar>
    <emn:searchParameter>
        <emn:username>xxxx</emn:username>
        <emn:password>xxxx</emn:password>
        <emn:maxHitCount>1</emn:maxHitCount>
        <emn:sorting>distance</emn:sorting>
        <emn:searchtext>example</emn:searchtext>        
    </emn:searchParameter>
    </emn:searchFoobar>
</soap:Body>
</soap:Envelope>
4

2 に答える 2

0
Unable to find required classes (javax.activation.DataHandler

クラスパスに jar ファイルがありません。おそらく、activation.jar です。こちらをご覧ください

于 2012-09-17T01:02:52.100 に答える
0

それはより良く見えます:)

<emn:searchFoobar>
<emn:searchParameter>
    <emn:username>xxxx</emn:username>
    <emn:password>xxxx</emn:password>
    <emn:maxHitCount>1</emn:maxHitCount>
    <emn:sorting>distance</emn:sorting>
    <emn:searchtext>example</emn:searchtext>        
</emn:searchParameter>
</emn:searchFoobar>

PHPでは、クラスを作成します:searchFooInParamWrapperclass.

、、、、、ファイルがusernameありpasswordます。うまくいけば、PHP から WSDL エンジンへのクラスが次のように作成されます。maxHitCountsortingsearchtext

構造体を削除します。そして、サードパーティのライブラリ/バグを修正するよりも簡単に解決できる問題

于 2012-09-17T02:12:11.457 に答える