2

Axis2 を使用して単純な Web サービスを作成しようとしています。その動作は非常に単純です。入力でファイルを受け取り、それを保存します。この「単純な」ファイル アップロード サービスを実行するために、いくつかのことを試しました。最初に、Java2WSDL と WSDL2Java を使用して WSDL ファイルを作成し、クライアントが java.io.File データ型を渡すことを試みました。もちろんうまくいきませんでした。

現在、SOAP 添付ファイルと MTOM または SwA を使用してファイルをアップロードしようとしています。axis2\WEB-INF\conf\axis2.xmlで両方を有効にしました

サーバー側、私のサービス操作の署名は次のとおりです。

public String uploadAttachment(OMElement omEle);

そして、これは Java2WSDL ツールを使用して生成された WSDL です。

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://services.italsystem.it" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://services.italsystem.it">
<wsdl:types>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://services.italsystem.it">
        <xs:element name="uploadAttachment">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="omEle" nillable="true" type="xs:anyType"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="uploadAttachmentResponse">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
</wsdl:types>
<wsdl:message name="uploadAttachmentRequest">
    <wsdl:part name="parameters" element="xsd:uploadAttachment"/>
</wsdl:message>
<wsdl:message name="uploadAttachmentResponse">
    <wsdl:part name="parameters" element="xsd:uploadAttachmentResponse"/>
</wsdl:message>
<wsdl:portType name="ImportServicePortType">
    <wsdl:operation name="uploadAttachment">
        <wsdl:input message="xsd:uploadAttachmentRequest" wsaw:Action="urn:uploadAttachment"/>
        <wsdl:output message="xsd:uploadAttachmentResponse" wsaw:Action="urn:uploadAttachmentResponse"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ImportServiceSoap11Binding" type="xsd:ImportServicePortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <wsdl:operation name="uploadAttachment">
        <soap:operation soapAction="urn:uploadAttachment" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ImportServiceSoap12Binding" type="xsd:ImportServicePortType">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <wsdl:operation name="uploadAttachment">
        <soap12:operation soapAction="urn:uploadAttachment" style="document"/>
        <wsdl:input>
            <soap12:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap12:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ImportServiceHttpBinding" type="xsd:ImportServicePortType">
    <http:binding verb="POST"/>
    <wsdl:operation name="uploadAttachment">
        <http:operation location="uploadAttachment"/>
        <wsdl:input>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="ImportService">
    <wsdl:port name="ImportServiceHttpSoap11Endpoint" binding="xsd:ImportServiceSoap11Binding">
        <soap:address location="http://localhost:8080/axis2/services/ImportService"/>
    </wsdl:port>
    <wsdl:port name="ImportServiceHttpSoap12Endpoint" binding="xsd:ImportServiceSoap12Binding">
        <soap12:address location="http://localhost:8080/axis2/services/ImportService"/>
    </wsdl:port>
    <wsdl:port name="ImportServiceHttpEndpoint" binding="xsd:ImportServiceHttpBinding">
        <http:address location="http://localhost:8080/axis2/services/ImportService"/>
    </wsdl:port>
</wsdl:service>
</wsdl:definitions>

クライアント側で、サービスを呼び出そうとしました:

Options options = new Options();
options.setTo(new EndpointReference("http://localhost:8080/axis2/services/ImportModule"));
options.setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);

ServiceClient sender = new ServiceClient(null,null);
sender.setOptions(options);
OperationClient mepClient = sender.createClient(ServiceClient.ANON_OUT_IN_OP);

MessageContext mc = new MessageContext();
SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
SOAPEnvelope env = factory.getDefaultEnvelope();
mc.setEnvelope(env);
FileDataSource fileDataSource = new FileDataSource(new File("c:\\test.jpg"));
DataHandler dataHandler = new DataHandler(fileDataSource);
mc.addAttachment("FirstAttachment",dataHandler);

mepClient.addMessageContext(mc);
mepClient.execute(true);

しかし、execute 呼び出しで「引数の数が間違っている」という Axis Fault が発生します。

また、WSDL2Java で生成されたクライアントを使用してサービスを呼び出してみました。

ImportServiceStub stub = new ImportServiceStub("http://localhost:8080/axis2/services/ImportModule");
UploadAttachment ua = new UploadAttachment();
FileDataSource fileDataSource = new FileDataSource(new File("c:\\test.jpg"));
DataHandler dataHandler = new DataHandler(fileDataSource);
ua.setOmEle(dataHandler);

UploadAttachmentResponse res = stub.uploadAttachment(ua);

しかし、別の Axis Fault が発生します。「org.apache.axiom.om.impl.llom.OMTextImpl は org.apache.axiom.om.OMElement にキャストできません」。しかし、オブジェクト型であるため、生成されたメソッド「setOmEle」にパラメーターとして何を指定できるかわかりません..

ファイルをアップロードすることは、誰かが想像できる単純なサービスの 1 つだと思っていました.. :P 誰かが私にアドバイスをくれることを本当に願っています.この問題は私を夢中にさせています!

前もって感謝します :)

4

4 に答える 4

2

実際には簡単です。MTOM を有効にし (SwA は無効) DataHandler、引数の型として使用します。

于 2012-05-19T09:16:08.087 に答える
1

アンドレアスのアドバイスは本当に役に立ちました!バイトの配列をサービスに渡そうとしましたが、サーバー上のファイルのサイズがクライアント上のファイルのサイズと同じではないなどの問題があります..

DataHandler を使用すると、そのような問題はありません。Axis (\WEB-INF\conf\axis2.xml) で MTOM を有効にしました。私のサービス操作の署名は次のようなものでした:

public String importFile(String name, DataHandler dh);

クライアント側では、WSDL2Java でクライアントを生成した後、次のようにサービスを使用しました。

ImportServiceStub stub = new ImportServiceStub("http://localhost:8080/axis2/services/ImportModule");
ImportFile importFile = new ImportFile(); //operation name
DataSource fds = new FileDataSource(new File("FileName"));
importFile.setName("FileName");
importFile.setDh(new DataHandler(fds));
stub.importFile(importFile);

あなたのサポートとアドバイスをありがとう:)

于 2012-05-21T13:21:06.000 に答える
1

こちらをご覧ください。ただし、サーブレットの doPost の使用についても検討してください。スレッドが示唆するように-チャンクによるAxis2ファイルのアップロード

これを見ていない場合は、使用している方法の詳細についてこちらも確認してください http://axis.apache.org/axis2/java/core/docs/mtom-guide.html

于 2012-05-18T10:02:43.403 に答える
0

wsdltojava を使用してスタブを生成すると、これを正常に実行できましたが、wsimport コマンドを使用して同じことを試みたときに、サーバー側で null パラメータ データを受信して​​います。

私は以下のプロセスに従っています。

  1. jax ws 仕様と mtom soap 11 バインディングを使用してサービス側のコードを作成しました@BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING)
  2. .aar ファイルを生成して、それを axis2 サーバーにアップロードします (axis1.6.2 & tomcat 6/7)
  3. サービス名をクリックするだけで、axis2 サーバーから wsdl ファイルを生成します。
  4. wsimport -keep -verbose wsdl url を使用して生成されたスタブ
  5. mtom を有効にしてコードをテストする

     //Enable MTOM
     SOAPBinding binding = (SOAPBinding) bp.getBinding();
     binding.setMTOMEnabled(true);
    
  6. 結果:- i/p を Sting & byte で渡しますが、i/p を受け取った @ サービス メソッドは null です

于 2014-11-20T11:02:06.947 に答える