如何正确处理Spring Data REST控制器中的请求参数?

如何正确处理Spring Data REST控制器中的请求参数?

问题描述:

在我的春节,数据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 World\n\n", 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"} 

什么都要我改变来解决这个错误?

+0

你是对的。谢谢! –

可是你有没有通过id,这个URL应该是localhost:8080/people/123

- 123 id

由于@Parth索兰奇提到的本地主机:8080元/人/ 123将解决这个问题。但这不够RESTful。由于这是一篇文章,我建议您更改控制器方法和参数中的URL映射,以便从URL中删除ID。 或宁可保留相同的代码,并将方法更改为PUT而不是POST。我不会做后者。因为它需要消费者预先知道资源的ID,并且它需要创建而不是已经存在的实体的更新。