Ошибка ввода / вывода при чтении входного сообщения;Вложенное исключение - java.io.IOException: поток закрыт - PullRequest
0 голосов
/ 07 марта 2019
@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;

    }

acima esta meu controller de uma Претензия в суде.

logo que executeto Requisicao no postman ele devolve esse erro:

"message": "Ошибка ввода-вывода при чтении входного сообщения; вложенное исключение - java.io.IOException: Поток закрыт"

1 Ответ

1 голос
/ 18 марта 2019

Ваша ошибка - результат двойного использования @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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...