#spring #spring-data-rest
#весна #spring-data-rest
Вопрос:
в моем приложении Spring Data REST у меня есть следующий контроллер:
@RestController
@RequestMapping("/people")
public class PersonController {
@RequestMapping(value = "/**", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> savePerson(@RequestBody Person person, UriComponentsBuilder b, @RequestParam Map<String, ?> id) {
UriComponents uriComponents =
b.path("/people/{id}").buildAndExpand(id);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setLocation(uriComponents.toUri());
responseHeaders.set("MyResponseHeader", "MyValue");
return new ResponseEntity<String>("Hello Worldnn", responseHeaders, HttpStatus.CREATED);
}
}
Когда я делаю следующий пост:
curl -i -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Frodo", "lastName" : "Baggins" }' http://localhost:8080/people
Я получаю эту ошибку:
{"timestamp":1476418616900,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"Map has no value for 'id'","path":"/people"}
Что я должен изменить, чтобы исправить эту ошибку?
Комментарии:
1. вы правы. Спасибо!
Ответ №1:
Но вы не прошли id
, этот URL-адрес должен быть localhost:8080/people/123
примечание — 123 является id
Ответ №2:
Как упоминал @Parth Solanki, localhost: 8080 / people / 123 решит эту проблему. Но этого недостаточно для RESTful. Поскольку это сообщение, я бы посоветовал вам изменить сопоставление URL-адресов в методе и параметре контроллера, чтобы он удалял ID из URL-адреса. Или, скорее, сохранить тот же код и изменить метод на PUT вместо POST. Я бы не стал делать последнее. Потому что потребителю нужно заранее знать идентификатор ресурса и его создание, а не обновление объекта, который уже существует.