1. ホーム
  2. json

[解決済み] Spring MVCのJSONによるマルチパートリクエスト

2023-02-21 08:24:50

質問

Spring MVCを使用して、JSONデータを含むファイルを投稿したいです。そこで、私は以下のようなレストサービスを開発しました。

@RequestMapping(value = "/servicegenerator/wsdl", method = RequestMethod.POST,consumes = { "multipart/mixed", "multipart/form-data" })
@ResponseBody
public String generateWSDLService(@RequestPart("meta-data") WSDLInfo wsdlInfo,@RequestPart("file") MultipartFile file) throws WSDLException, IOException,
        JAXBException, ParserConfigurationException, SAXException, TransformerException {
    return handleWSDL(wsdlInfo,file);
}

レストクライアントからリクエストを送るときに content-Type = multipart/form-data or multipart/mixed で送信すると、次のような例外が発生します。 org.springframework.web.multipart.support.MissingServletRequestPartException

誰かこの問題を解決するために私を助けることができますか?

私は @RequestPart を使用して、Multipart と JSON の両方をサーバーに送信できますか?

どのように解決するのですか?

Spring MVCのMultipart RequestをJSONデータで実装する方法です。

JSONデータによるMultipartリクエスト(Mixed Multipartとも呼ばれる)。

Spring 4.0.2 ReleaseのRESTfulサービスでは、@RequestPartを使用して、最初のパートをXMLまたはJSON形式のデータ、次のパートをファイルとしてHTTPリクエストを実現することができます。以下はその実装例です。

Javaスニペットです。

ControllerのRestサービスでは、@RequestPartとMultipartFileを混在させて、Multipart + JSONのリクエストを処理することになります。

@RequestMapping(value = "/executesampleservice", method = RequestMethod.POST,
    consumes = {"multipart/form-data"})
@ResponseBody
public boolean executeSampleService(
        @RequestPart("properties") @Valid ConnectionProperties properties,
        @RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
    return projectService.executeSampleService(properties, file);
}

フロントエンド(JavaScript)のスニペットです。

  1. FormDataオブジェクトを作成します。

  2. 以下のいずれかの手順で、FormDataオブジェクトにファイルを追加します。

    1. file"型の入力要素を用いてファイルをアップロードした場合、そのファイルをFormDataオブジェクトに追加します。 formData.append("file", document.forms[formName].file.files[0]);
    2. FormDataオブジェクトに直接ファイルを追加する。 formData.append("file", myFile, "myfile.txt"); または formData.append("file", myBob, "myfile.txt");
  3. 文字列化されたJSONデータでblobを作成し、FormDataオブジェクトに追加します。これにより、マルチパートリクエストの2番目の部分の Content-type は、ファイルタイプではなく "application/json" になります。

  4. サーバーにリクエストを送信します。

  5. リクエストの詳細です。

    Content-Type: undefined . これにより、ブラウザはContent-Typeをmultipart/form-dataに設定し、boundaryを正しく埋めるようになります。手動で Content-Type を multipart/form-data に設定すると、リクエストの boundary パラメータを埋められなくなります。

Javascriptのコードです。

formData = new FormData();

formData.append("file", document.forms[formName].file.files[0]);
formData.append('properties', new Blob([JSON.stringify({
                "name": "root",
                "password": "root"                    
            })], {
                type: "application/json"
            }));

リクエストの詳細

method: "POST",
headers: {
         "Content-Type": undefined
  },
data: formData

リクエストのペイロード。

Accept:application/json, text/plain, */*
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryEBoJzS3HQ4PgE1QB

------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: application/txt


------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="properties"; filename="blob"
Content-Type: application/json


------WebKitFormBoundaryvijcWI2ZrZQ8xEBN--