2016-10-20 2 views
1

У моего REST API-интерфейса Spring есть проблема (=>406), когда конечная точка заканчивается именем файла, например. /file/example.xml, потому что он предполагает, что результат должен быть XML, но это неправильно (это должен быть JSON).Spring REST - как принудительно использовать тип ответа JSON, когда URL заканчивается на .xml

Written [{timestamp=Thu Oct 20 11:11:14 CEST 2016, status=406, error=Not Acceptable, exception=org.springframework.web.HttpMediaTypeNotAcceptableException, message=Could not find acceptable representation, path=/file/foobar.xml}] as "application/json" using [org.springfr[email protected]7015ebef]

Я читал кое-что о Spring 4 функции обнаружения расширений файлов и overwritting тип ответа, поэтому я попытался принудить тип ответа, но я не нашел решение.

Вот мой REST контроллер:

@CompileStatic 
@RestController 
class ImportFileController { 
    @RequestMapping(
      value = "/file/{fileName:.+}", 
      method = RequestMethod.PUT, 
      produces = "application/json" 
    ) 
    @ResponseBody 
    public ImportFile update(
      @PathVariable("fileName") String fileName, 
      @RequestBody ImportFile importFile) { 
     // .. 
     return importFile 
    } 
} 

Это запрос/ответ:

Request PUT /file/foobar.xml {"reader_name":"something"} 
Response 406 { 
    "timestamp" : "2016-10-20 08:56:35", 
    "status" : 406, 
    "error" : "Not Acceptable", 
    "exception" : "org.springframework.web.HttpMediaTypeNotAcceptableException", 
    "message" : "Could not find acceptable representation", 
    "path" : "/file/foobar.xml" 
} 

Что я пробовал:

  • Использование {filenName:.+} вместо {fileName}
  • Использование produces в моем @RequestMapping
  • Отправка пользовательских Accept заголовок (application/json)
  • Установка spring.mvc.path-matching.suffix-pattern к true или false, но это было просто дикое предположение

Что сработало:

  • Изменение конечной точки из /file/{fileName:.+} до /file/{fileName:.+}/update Но это всего лишь обходной путь, а не решение.

Важно: Я использую Groovy, и я использую конфигурацию YML.

+0

Посмотрите http://stackoverflow.com/a/20743941/1496158. В этом сообщении описывается, как отключить отображение обработчика или включить отображение обработчика только для определенных расширений. – dudel

+0

Исправьте меня, если я ошибаюсь, но это только для конфигурации Java/XML – MonkeyMonkey

+0

Но, конечно же, должен быть способ настройки Spring beans? Это подразумевалось как указатель на то, что нужно настроить. – dudel

ответ

0

Одним из вариантов является определить, что ваш метод потребляет JSON, а также, используя @RequestMapping options:

@RequestMapping(
      value = "/file/{fileName:.+}", 
      method = RequestMethod.PUT, 
      produces = "application/json", 
      consumes = "application/json", 
    ) 

Это должно предотвратить приложение от попыток преобразовать данные в XML.

Кроме того, убедитесь, что клиент является установка «Content-Type» заголовок правильно

+0

К сожалению, это не влияет на результат, я все равно получаю 406-неприемлемый – MonkeyMonkey