1

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 転送されますか?

ヘルプ/ヒントをいただければ幸いです。

4

1 に答える 1

1

いくつかの調査とテストの後、答えは次のとおりです。

  • エラーは、grails がサービスを含む独自のフィルタリングを追加するためです。したがって、サービスがstatic excludes = ["/services/*"]UrlMappings.groovy でこのようにフィルター処理されないようにすることで、機能します。
  • いいえ。MTOMFeature がなければ、ファイルはリクエスト内の他のデータとして扱われます。つまり、メモリに保存されるため、大きなファイルで問題が発生します。
于 2010-08-05T00:01:54.693 に答える