Я работаю с Spring 4.0.7
О Spring MVC, для исследовательских целей у меня есть следующее:
@RequestMapping(value="/getjsonperson",
method=RequestMethod.GET,
produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Person getJSONPerson(){
logger.info("getJSONPerson - getjsonperson");
return PersonFactory.createPerson();
}
@RequestMapping(value="/getperson.json", method=RequestMethod.GET)
public @ResponseBody Person getPersonJSON(){
logger.info("getPerson - getpersonJSON");
return PersonFactory.createPerson();
}
Каждый работает отлично, соблюдайте как JSON, так и без расширения:
- /getjsonperson
- /getperson.json
То же самое для XML
@RequestMapping(value="/getxmlperson",
method=RequestMethod.GET,
produces=MediaType.APPLICATION_XML_VALUE
)
public @ResponseBody Person getXMLPerson(){
logger.info("getXMLPerson - getxmlperson");
return PersonFactory.createPerson();
}
@RequestMapping(value="/getperson.xml", method=RequestMethod.GET)
@ResponseBody
public Person getPersonXML(){
logger.info("getPerson - getpersonXML");
return PersonFactory.createPerson();
}
Каждый работает отлично, соблюдайте как XML, так и без расширения:
- /getxmlperson
- /getperson.xml
Теперь о Restful У меня есть следующее:
@RequestMapping(value="/person/{id}/",
method=RequestMethod.GET,
produces={MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<Person> getPersonCustomizedRestrict(@PathVariable Integer id){
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);//302
}
Наблюдайте за MediaType
, он смешан, для JSON и XML
Через RestTemplate я могу указать значение Accept
if(type.equals("JSON")){
logger.info("JSON");
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
}
else if(type.equals("XML")){
logger.info("XML");
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
}
….
ResponseEntity<Person> response =
restTemplate.exchange("http://localhost:8080/spring-utility/person/{id}/customizedrestrict",
HttpMethod.GET,
new HttpEntity<Person>(headers),
Person.class,
id
);
До сих пор я мог использовать один URL/URI для получения некоторых данных в форматах XML или JSON. Он отлично работает
Моя проблема связана с Spring MVC... просто рассмотрите
@RequestMapping(value="/{id}/person",
method=RequestMethod.GET,
produces={MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public @ResponseBody Person getPerson(@PathVariable Integer id){
return personMapRepository.findPerson(id);
}
Я могу вызвать или активировать этот метод обработчика (@RequestMapping
) через:
- jQuery, работающий с Ajax, я могу указать значение
Accept
(например, JSON) - Poster, с помощью кнопки
Headers
я могу установитьAccept
Вопрос 1:
Но для общей ссылки? как я могу установить значение Accept
? возможно?
Я думал по-другому обойти эту проблему.
-
http://localhost:8080/spring-utility/person/getpersonformat?format=json
-
http://localhost:8080/spring-utility/person/getpersonformat?format=xml
Обратите внимание:
-
?format
Поэтому
@RequestMapping(value="/getpersonformat",
method=RequestMethod.GET,
produces={MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public @ResponseBody Person getPerson(@RequestParam String format){
return personMapRepository.findPerson(id);
}
Вопрос второй:
Какой код для показанного выше метода должен быть добавлен для настройки формата возвращаемого типа? Я имею в виду, JSON или XML, возможно?
Я подумал:
@RequestMapping(value="/getpersonformataltern",
method=RequestMethod.GET
produces={MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE}
)
public ResponseEntity<Person> getPersonFormat(@RequestParam String format){
logger.info("getPersonFormat - format: {}", format);
HttpHeaders httpHeaders = new HttpHeaders();
if(format.equals("json")){
logger.info("Ok JSON");
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
}
else{
logger.info("Ok XML");
httpHeaders.setContentType(MediaType.APPLICATION_XML);
}
return new ResponseEntity<>(PersonFactory.createPerson(), httpHeaders, HttpStatus.OK);
}
Но:
Если я выполняю URL-адрес:
-
http://localhost:8080/spring-utility/person/getpersonformataltern?format=json
Я получаю
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<id>1</id>
<firstName>Manuel</firstName>
<lastName>Jordan</lastName>
…
</person>
Да в XML!
Примечание. Я могу подтвердить распечатку консоли Ok JSON
Если я выполняю URL-адрес:
-
http://localhost:8080/spring-utility/person/getpersonformataltern?format=xml
Я получаю
This XML file does not appear to have any style information associated with it.
The document tree is shown below.
<person>
<id>1</id>
<firstName>Manuel</firstName>
<lastName>Jordan</lastName>
…
</person>
Вопрос три
Какой код для показанного выше метода должен быть добавлен для исправления вывода JSON? Я не знаю, что не так или нет.
Есть три вопроса.
Спасибо
Альфа
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
Map<String,MediaType> mediaTypes = new LinkedHashMap<>();
mediaTypes.put("json", MediaType.APPLICATION_JSON);
mediaTypes.put("xml", MediaType.APPLICATION_XML);
configurer.mediaTypes(mediaTypes);
configurer.defaultContentType(MediaType.TEXT_HTML);
}