как правильно обрабатывать параметры запроса в контроллере Spring Data REST?

#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. Я бы не стал делать последнее. Потому что потребителю нужно заранее знать идентификатор ресурса и его создание, а не обновление объекта, который уже существует.