这是我的控制器:
@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错误;嵌套异常为java.io.IOException:流已关闭”
您的错误是@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)