2016-11-22 3 views
0

/домашние животные дают ответ json. Я хотел бы использовать /pets.xml, чтобы получить ответ xml, сохраняя при этом @RequestMapping («домашние животные») на контроллере. Я могу использоватьSpringMVC RequestMapping: добавление xml к пути контроллера для ответа xml

@RequestMapping("/index") 
@RequestMapping("/index.xml") 

как обходной путь, но это не то, что я ищу.

@RestController 
@RequestMapping("pets") 
class PetController { 
    /*code*/ 
    @RequestMapping(produces = arrayOf("application/json")) 
    fun findPetsJson(): List<PetDto> { 
     return petService.findAll() 
    } 
    // this results in /pets/.xml for the xml response. I'm aiming for /pets.xml 
    @RequestMapping(".xml", produces = arrayOf("application/xml")) 
    fun findPetsXml(): List<PetDto> { 
     return petService.findAll() 
    } 
    } 
+0

Я не поклонник решения этой проблемы с явными путями, но с согласованием содержимого. Более старая, но также текущая запись с весны io https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc – meistermeier

+0

Удалите 'производит' из вашего сопоставления запросов (или добавьте' приложение/xml' до первого). Оба символа '/ pets' и'/pets.xml' будут отображаться, а согласование контента должно делать все остальное. По умолчанию отображение создается для '/ pets' и'/pets. * 'При обнаружении контроллера. –

+0

@ M.Deinum, спасибо, это решило его гораздо более элегантным способом, чем я надеялся: я могу фактически удалить вторую форму запроса и функцию в целом - они могут быть написаны только одним. Теперь мне нужно только выяснить, как установить приоритет между ними (какой из них я получаю, когда я не использую расширение на пути, то есть «/ pets», но я уверен, что это легко выполнимо. Пожалуйста, добавьте свой комментарий в качестве ответа, видя что он решил мою проблему. – Irikos

ответ

1

по умолчанию Spring MVC RequestMappingHandlerMapping добавит несколько отображений для @RequestMapping аннотированных методов (или классов). Он будет рядом с настроенным один, добавьте один конец с .* так, чтобы он соответствовал расширениям.

Так что в вашем случае /pets.xml уже поддерживается отображением /pets.*, которое создается по умолчанию. Ваш produces теперь ограничивает только принимаемые запросы на основе заголовка запроса Accept.

По умолчанию расширение файла имеет приоритет над заголовком Content-Type.

0

Имея только одну функцию, достаточно. Вам просто нужно добавить arrayOf («приложения/JSON», «приложение/XML) для него, и он производит как (он на самом деле делает для обоих, даже если вы удалите его, но это явно, как это.

@RestController 
@RequestMapping("pets") 
class PetController { 
    /*code*/ 
    @RequestMapping(produces = arrayOf("application/json", "application/xml), method = RequestMethod.GET) 
    fun findPetsJson(): List<PetDto> { 
     return petService.findAll() 
    } 
} 

Этот код позволяет interogations в обоих /pets.json и /pets.xml

Смежные вопросы