4

添付ファイルを送受信するための Web サービスがあり、JAXB をマーシャラーとして使用したいのですが、JAXB はメッセージ本文で送受信される添付ファイルを base64 文字列としてインライン化するため、これまでのところ正しく機能していません。メモリ不足になり、OutOfMemoryError が頻繁に発生します。セットアップと修正の試みの概要を説明しています。誰かがそれを正しく行うのを手伝ってくれることを願っています.

私は大きな添付ファイルを処理する必要があるため、メッセージ ファクトリとしては SAAJ よりも Axiom を選択しています。アタッチメントが関係している場合を除き (インラインの問題)、エンドポイント メソッドのパラメーターと戻り値の型のマーシャラーとして JAXB を正常に使用できます。これは私のセットアップです:

Web サービス構成 XML:

<beans xmlns=...>

    <context:component-scan base-package="com.example.webservice" />

    <sws:annotation-driven />

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>com.example.webservice.oxm.FileTestResponse</value>
                <value>com.example.webservice.oxm.FileTestRequest</value>
            </list>
        </property>
        <property name="mtomEnabled" value="true"/>
    </bean>

    <bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
        <property name="payloadCaching" value="true"/>
        <property name="attachmentCaching" value="true"/>
    </bean>

    <sws:dynamic-wsdl id="fileTest" portTypeName="fileTest" locationUri="/webservice/fileTest/" targetNamespace="http://example.com/webservice/definitions" >
        <sws:xsd location="/WEB-INF/fileTest.xsd" />
    </sws:dynamic-wsdl>

</beans>

私のXSDの一部:

<!-- I generate the marshalling classes with XJB, and using
    xmime:expectedContentTypes it correctly creates mtomData field
    with DataHandler type instead of byte[] -->
<xs:element name="fileTestRequest">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="mtomData" type="xs:base64Binary"
                xmime:expectedContentTypes="application/octet-stream"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

私のエンドポイントクラス:

package com.example.webservice;

import ...

@Endpoint
@Namespace(prefix = "s", uri = FileTestEndpoint.NAMESPACE)
public class FileTestEndpoint {

    public static final String NAMESPACE = "http://example.com/webservice/schemas";

    @PayloadRoot(localPart = "fileTestRequest", namespace = NAMESPACE)
    @ResponsePayload
    public FileTestResponse fileTest(@RequestPayload FileTestRequest req) throws IOException {
        // req.getMtomData() and do something with it
        FileTestResponse resp = new FileTestResponse();
        DataHandler dataHandler = new DataHandler(new ByteArrayDataSource("my file download data".getBytes(), "text/plain"));
        resp.setData(dataHandler);
        return resp;
    }
}

したがって、このコードは機能しますが、添付ファイルの場合とは異なります。私は仕事の解決策を探しています:

どうやら、 WSS4J で発生しているこのインライン化の問題について私が投稿したこの他の SO の質問から、最良の助けが得られたようです。Blaise Doughan は、彼がブログに投稿したように、(un)marseller を適切に処理するために必要であり、設定AttachmentMarshallerする必要があると述べました。AttachmentUnmarshaller


したがって、添付マーシャラーがこの問題を解決するための鍵であると思います。

それらを (un) マーシャラーに設定するには、指定された (un) マーシャラーにアタッチメント マーシャラー (Doughan のコードをコピーしました) を設定Jaxb2MarshallerするinitJaxbMarshaller以外に方法はありませんでした。initJaxbUnmarshaller

Jaxb2Marshallerしかし、手動で に設定しても、自分のものは使用されていませんsws:annotation-driven

<sws:annotation-driven marshaller="jaxb2Marshaller" unmarshaller="jaxb2Marshaller"/>

<bean id="jaxb2Marshaller" class="com.example.webservice.MyJaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.example.webservice.oxm.FileTestResponse</value>
            <value>com.example.webservice.oxm.FileTestRequest</value>
        </list>
    </property>
    <property name="mtomEnabled" value="true"/>
</bean>

このマーシャラー クラスは作成されますが、使用されることはありません。理由がわからないため、AttachmentMarshallers が問題を解決できるかどうかをまだテストできませんでした。

今のところ言えることはこれだけです。試すにはかなりの数のアプローチがあります。

  • MyJaxb2Marshallerが無視されている理由を見つけます。おそらく最も簡単です。
  • s で解決できない場合は、JAXB 添付ファイルのインライン展開を別の方法で修正AttachmentMarshallerしてください。それがどうなるかわかりません。
  • JAXB を他のマーシャラーに置き換えます。これは同様に機能します (主に Axiom サポート、おそらく WSS4J)。

私はこの問題に長い間取り組んでおり、明らかな解決策を見逃しているに違いありません。どんな助けでも大歓迎です。

ありがとう!


ライブラリのバージョン:

  • Spring 3.1.0 (コア、Bean、oxm など)
  • Spring WS 2.1.0 (コアおよび Spring XML)
  • StAX2 2.1
  • WoodSToX 3.2.9 (wstx)
  • JAXB 2.2.5-2 (API+実装)
  • Apache 公理 1.2.13 (API+impl+c14n+dom)
  • Apache Mime4j 0.7.2 (コア)

アプリ サーバーは、Java 1.6.0u14 を使用した Oracle 11g R1 Patchset 1 です。

4

0 に答える 0