Неправильный запрос Spring RestController POST 400

У меня есть Spring RestController, который при любой попытке отправить ему сообщение возвращает 400 Bad Request, несмотря на то, что в Chrome Developer Tools отправляются правильные данные. Аннотация @Valid выбивает его, потому что объект ParameterDTO вообще не заполняется.

Мой Контроллер

@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, и хотя моя проблема могла быть там, но у меня такая же проблема с Postman. Я устанавливаю заголовок Content-Type и Accept. Похоже, Spring вообще не десериализует данные.

введите описание изображения здесь

введите описание изображения здесь


person greyfox    schedule 23.02.2017    source источник
comment
Я думаю, что вам не хватает @RequestBody перед ParameterDTO parameterData объявлением   -  person bart.s    schedule 23.02.2017
comment
Это не требуется, контроллер объявлен как @RestController, RequestBody был необходим до того, как он был добавлен в Spring 4.   -  person greyfox    schedule 23.02.2017
comment
да, это обязательно. @RestController дает вам @ResponseBody ограничения, а не @RequestBody   -  person bart.s    schedule 23.02.2017
comment
Ааааааааааааааааааааааааааау более более или) или более и более иие ота ... вот что происходит, когда вы переключаетесь между .NET и Spring. Спасибо! Если вы ответите, я приму его   -  person greyfox    schedule 23.02.2017


Ответы (1)


Вам необходимо добавить аннотацию @RequestBody перед объявлением ParameterDTO parameterData, как показано ниже:

    @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();
    }
person bart.s    schedule 23.02.2017