Это мой контроллер:
@RestController
@RequestMapping("/reclamacao")
public class ClaimController {
@Autowired
private ClaimRepository claimRepository;
@CrossOrigin
@PostMapping("/adicionar")
public Claim toCreateClaim(@Valid @RequestBody Claim claim, @RequestBody List<Sector> sectors) {
if (claim.getNumber() != null) {
if (claimRepository.findByNumber(claim.getNumber()).isPresent()) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Já existe uma reclamação com esse número.");
}
}
claimRepository.save(claim);
for (Sector sect: sectors) {
claimRepository.saveClaim(claim.getId(), sect);
}
return claim;
}
Это ошибка, которую я получаю:
"message": "I/O error while reading input message; nested exception is java.io.IOException: Stream closed"




Ваша ошибка является результатом того, что @RequestBody дважды используется в аргументах вашего метода контроллера. Следующая строка вызывает проблему:
toCreateClaim(@Valid @RequestBody Claim claim, @RequestBody List<Sector> sectors)
Вы не можете использовать его таким образом, так как разрешен только один @RequestBody для каждого метода. Использование @RequestBody Spring преобразует тело входящего запроса в указанный объект (что закрывает поток, представляющий тело в конце), поэтому попытка использовать @RequestBody второй раз в том же методе не имеет смысла, поскольку поток уже закрыт.
Поэтому, чтобы решить вашу проблему, создайте выделенный объект с обоими указанными вами объектами. Нравиться:
public class Complaint {
Claim claim;
List<Sector> sectors;
}
А затем измените аргументы метода на:
toCreateClaim(@RequestBody Complaint complaint)
Более того, если вы хотите проверить структуру вашего объекта с помощью @Valid и сделать результат доступным, вам нужно добавить BindingResult сразу после проверяемого аргумента:
toCreateClaim(@Valid @RequestBody Complaint complaint, BindingResult bindingResult)