2017-02-23 215 views
4

我有一个Spring RestController,尽管在Chrome开发人员工具中看到正确的数据,但是任何尝试发布到它的尝试都会返回400错误请求。 @Valid注释正在踢出它,因为ParameterDTO对象根本没有被填充。Spring RestController POST 400错误请求

我的控制器

@RestController 
@RequestMapping(path = "/api/parameters", consumes = {MediaType.APPLICATION_JSON_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE}) 
public class ParameterResource { 

    private final ParameterService parameterService; 

    @Autowired 
    public ParameterResource(ParameterService parameterService) { 
     this.parameterService = parameterService; 
    } 

    @GetMapping 
    public ResponseEntity<?> getParameters(@RequestParam(value = "subGroupId", required = false) Integer subGroupId) { 
     if (subGroupId != null) { 
      return ResponseEntity.ok(parameterService.getParameters(subGroupId)); 
     } 
     return ResponseEntity.ok(parameterService.getParameters()); 
    } 

    @PostMapping 
    public ResponseEntity<?> createParameter(@Valid ParameterDTO parameterData) { 
     int id = parameterService.saveParameter(parameterData); 
     URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}") 
       .buildAndExpand(id).toUri(); 
     return ResponseEntity.created(uri).build(); 
    } 

    @GetMapping(path = "/levels") 
    public ResponseEntity<?> getParameterLevels() { 
     return ResponseEntity.ok(ParameterLevels.getParameterLevelMap()); 
    } 

    @GetMapping(path = "/levels/{id}/values") 
    public ResponseEntity<?> getLevelValues(@PathVariable("id") int levelId) { 
     return ResponseEntity.ok(parameterService.getParameterLevelValues(levelId)); 
    } 

    @GetMapping(path = "/types") 
    public ResponseEntity<?> getParameterTypes() { 
     return ResponseEntity.ok(parameterService.getParameterTypes()); 
    } 
} 

我使用从JavaScript,虽然我的问题可能是有爱可信,但我使用邮差同样的问题。我正在设置Content-Type和Accept标题。看起来Spring似乎并没有对数据进行反序列化。

enter image description here

enter image description here

+0

我认为你缺少'@ RequestBody'之前'ParameterDTO parameterData'声明 –

+0

那不需要控制器被声明为@RestController,在Spring 4中添加之前需要RequestBody – greyfox

+0

是的,这是必需的。什么'@ RestController'给你的是'@ ResponseBody'边界,而不是'@ RequestBody' –

回答

5

您需要ParameterDTO parameterData声明添加注释@RequestBody,如下图所示:

@PostMapping 
    public ResponseEntity<?> createParameter(@RequestBody @Valid ParameterDTO parameterData) { 
     int id = parameterService.saveParameter(parameterData); 
     URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}") 
       .buildAndExpand(id).toUri(); 
     return ResponseEntity.created(uri).build(); 
    }