Spring REST @RequestMapping с несколькими типами мультимедиа

Я разрабатываю REST API с помощью Spring и хотел бы, чтобы API обрабатывал запросы POST с различными типами мультимедиа, а именно данные формы JSON в теле запроса или файл JSON, отправленный через запрос.

Итак, когда у меня есть два отдельных метода с такими сигнатурами, оба работают нормально,

@RequestMapping(value = "/configuration" , method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public String setConfiguration(@RequestPart MultipartFile file)
@RequestMapping(value = "/configuration" , method = RequestMethod.POST, consumes = {MediaType.APPLICATION_JSON_VALUE}
public String setConfiguration(@RequestBody Configuration configuration)

Логика обработки обоих методов почти одинакова, поэтому я пытаюсь использовать один метод для поглощения обоих типов формата данных с помощью этого кода:

@RequestMapping(value = "/configuration" , method = RequestMethod.POST, consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
public String setConfiguration(@RequestPart MultipartFile file, @RequestBody Configuration configuration)

Однако ответ об ошибке будет возвращен как,

{"timestamp": 1443744180124,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.web.multipart.MultipartException",
  "message": "The current request is not a multipart request",
  "path": "/v1/testconfiguration"
}

Хотите знать, есть ли у меня какое-то фундаментальное непонимание типа носителя REST, и если это выполнимо, как я могу добиться этого с помощью Spring?


person Derek    schedule 02.10.2015    source источник
comment
Если вы хотите повторно использовать логику, вы можете сделать так, чтобы первый метод преобразовывал MultipartFile в Configuration, а затем вызывал второй метод с этим в качестве аргумента. Итак, у вас все еще есть 2 обработчика POST, но вы не повторяетесь.   -  person approxiblue    schedule 02.10.2015
comment
@aboutiblue, спасибо, похоже, это то, что я должен был сделать   -  person Derek    schedule 02.10.2015


Ответы (2)


Если они оба работают как отдельные методы, вам лучше просто делать это таким образом.

Вероятно, это будет более аккуратно и легко читать, нет необходимости пытаться оптимизировать, как вы делаете в данный момент, не то чтобы я не работал над своим собственным кодом.

person Mhowell    schedule 02.10.2015
comment
Спасибо. Пытаясь узнать, что здесь лучше всего обрабатывается, похоже, лучше держать API с разными типами мультимедиа отдельно. - person Derek; 02.10.2015

Хотя с тех пор, как был задан этот вопрос, прошло уже более 4 лет, чтобы дать ответ людям, которые столкнутся с такой же проблемой в будущем.

Поскольку Request Method равно POST в обоих случаях, вместо @RequestMapping можно использовать @PostMapping.

С @PostMapping можно иметь несколько MediaTypes. Например, приведенный ниже код не должен вызывать никаких проблем.

@PostMapping(value = "/configuration", consumes = { MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE })
public String setConfiguration(@RequestPart MultipartFile file, @RequestBody Configuration configuration)

ПРИМЕЧАНИЕ. Поскольку параметры метода разные, подход @Mhowell кажется правильным.

person Tahmid Ali    schedule 07.05.2020