Не удается загрузить файл при использовании пружинного сервера, созданного swagger - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу реализовать функцию считывания файлов в моей службе REST. Так как я сам не знаю, как использовать spring, я использую swagger для генерации кода сервера. Обычно это прекрасно работает, но когда я пытаюсь загрузить файлы, я получаю следующую ошибку:

{
"timestamp": "2018-11-07T12:27:43.119Z",
"status": 400,
"error": "Bad Request",
"exception":   "org.springframework.web.multipart.support.MissingServletRequestPartException",
"message": "Required request part 'file' is not present",
"path": "/requirements/import"
} 

Мой yaml использует следующие строки для функции импорта:

/requirements/import:
post:
  consumes:
  - multipart/form-data
  description:
    Returns all requirements contained in the submitted reqIf file.
  parameters:
  - name: reqIfFile
    in: formData
    type: file
    description: The reqIf file that contains the requirements.
  responses:
    200:
      description: An array of requirements.
      schema:
        type: array
        items:
          $ref: 'requirement' 

Сгенерированный интерфейс (с некоторыми добавленными исключениями):

@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2018-04-05T07:19:00.887Z")

@Api(value = "requirements", description = "the requirements API")
public interface RequirementsApi {

@ApiOperation(value = "", nickname = "requirementsImportPost", notes = "Returns all requirements contained in the submitted reqIf file.", response = Requirement.class, responseContainer = "List", tags = {})
@ApiResponses(value = {
        @ApiResponse(code = 200, message = "An array of requirements.", response = Requirement.class, responseContainer = "List") })
@CrossOrigin(origins = "*")
@RequestMapping(value = "/requirements/import", produces = { "application/json" }, consumes = {
        "multipart/form-data" }, method = RequestMethod.POST)
ResponseEntity<List<Requirement>> requirementsImportPost(
        @ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile reqIfFile)
        throws IOException, ContinuumException;

}

Код, который фактически выполняет считывание:

@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2018-04-05T07:19:00.887Z")

@Controller
public class RequirementsApiController implements RequirementsApi {

@Override
public ResponseEntity<List<Requirement>> requirementsImportPost(
        @ApiParam(value = "file detail") @Valid @RequestPart("file") final MultipartFile reqIfFile)
        throws IOException, ContinuumException {

    InputStream fileStream = new BufferedInputStream(reqIfFile.getInputStream());
    List<Requirement> list = ReadReqIF.readReqIfFile(fileStream);
    return new ResponseEntity<List<Requirement>>(list, HttpStatus.OK);
}

}

Может кто-нибудь сказать мне, где возможная ошибка?

1 Ответ

0 голосов
/ 13 декабря 2018

Я столкнулся с той же проблемой с моим пружинным сервером.

Мне удалось обойти проблему, изменив сгенерированный серверный код, изменив имя «file» в @RequestPart («file») на имя, указанное в спецификации swagger. В вашем случае это должно быть @RequestPart ("reqIfFile"). Это должно быть изменено как в интерфейсе, так и в коде контроллера.

Вероятно, есть ошибка в коде генератора сервера Spring в редакторе Swagger. Я не могу придумать какую-либо другую причину, по которой аннотация RequestPart будет названа «file», которая по сути является «типом», а не именем параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...