读取输入消息时发生I / O错误;嵌套异常为java.io.IOException:流关闭

时间:2019-03-07 19:17:42

标签: java sql spring spring-mvc

@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 Claim de estou adicionando

徽标执行没有邮递员的要求:

“ message”:“读取输入消息时发生I / O错误;嵌套异常为java.io.IOException:流已关闭”

1 个答案:

答案 0 :(得分:0)

您的错误是@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)