添付ファイルを送受信するための 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;
}
}
したがって、このコードは機能しますが、添付ファイルの場合とは異なります。私は仕事の解決策を探しています:
- Spring Forums: 正しい MTOM 処理? : いくつかの Axiom クラスを拡張することを提案していますが、コードは (2008 年) 以降かなり変更されており、動作させることができませんでした。
- Spring フォーラム: Response-Attachment/Saaj/Jaxb : 1.6u14 で修正された JVM バグが原因である可能性があります。これは、私の Weblogic バージョンで使用されているものです (さらに、トピック作成者には機能しませんでした)。
- Spring フォーラム: Spring-WS クライアントで大きな添付ファイルを送信する: 誰かが Axis2 を使用して Spring WS を直接バイパスして解決しましたが、これは重要ではありません。
- Stackoverflow: MTOM 添付ファイルを使用した Spring-WS Web サービス - Hello world テスト: 私と同じ問題、2 週間前、回答なし。
どうやら、 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>
このマーシャラー クラスは作成されますが、使用されることはありません。理由がわからないため、AttachmentMarshaller
s が問題を解決できるかどうかをまだテストできませんでした。
今のところ言えることはこれだけです。試すにはかなりの数のアプローチがあります。
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 です。