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

Это мой контроллер:

@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"

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
17 750
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша ошибка является результатом того, что @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)

Другие вопросы по теме