Grails と Metro 1.0.2 プラグインで公開されている MTOM 対応の Web サービスがあります。
@MTOM
@WebService(targetNamespace="http://com.domain")
class TestService {
@WebMethod
int uploadFile(@XmlMimeType("application/octet-stream")DataHandler data) {
data.dataSource.inputStream.eachLine {
println "reading: -> ${it}"
}
return 0
}
}
このチュートリアルに従って、次のような Java テスト クライアントをセットアップします。
public class Client {
public static void main(String[] argv) {
MTOMFeature feat = new MTOMFeature();
TestService service = new TestServiceService().getTestServicePort(feat);
Map<String, Object> ctxt = ((BindingProvider)service).getRequestContext();
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
service.uploadFile(new DataHandler(new FileDataSource("c:/file.xml")));
}
}
クライアントを実行すると、次のエラー メッセージが表示されます。
例外のため、SOAP メッセージを作成できませんでした: org.jvnet.mimepull.MIMEParsingException: 開始境界がありません
ただし、MTOMFeature を追加せずに
TestService service = new TestServiceService().getTestServicePort();
、ファイルをアップロードするだけで問題ありません。しかし、サーバー側とクライアント側の両方で MTOM が有効になっていない場合、ファイル全体がメモリに保持されます (ストリーミングされません)。だから、私の質問は
- なぜそのエラーが発生するのですか?
- MTOMFeature を追加しない場合でも、ファイルは MTOM 転送されますか?
ヘルプ/ヒントをいただければ幸いです。