回答

收藏

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

技术问答 技术问答 118 人阅读 | 0 人回复 | 2023-09-12

这是我的控制器:# E, O3 M2 H) J
@RestController@RequestMapping("/reclamacao")public class ClaimController    @Autowired    private ClaimRepository claimRepository;    @CrossOrigin    @PostMapping("/adicionar")    public Claim toCreateClaim(@Valid @RequestBody Claim claim,@RequestBody List 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;    }这是我得到的:) K' c8 C6 S/ D
“ messageI / O错误;异常嵌套java.io.IOException:流已关闭”
3 v1 I" ]+ C! |
                                                                ; r3 x" m8 u5 a' p$ A8 n! b7 _/ I2 }, [/ h
    解决方案:                                                                % E9 s. U6 Z) z# B# a! d
                                                                您的错误是@RequestBody两次使用控制器方法参数的结果。这个问题是由以下行动引起的:& }% u, {/ V5 B+ l# T
toCreateClaim(@Valid @RequestBody Claim claim,@RequestBody List sectors)你不能这样用,因为每种方法只允许一种@RequestBody。使用@RequestBody
- [5 x  T1 L8 ]1 f" ?% f  p$ HSpring将传输的请求主体转换为指定的对象(在最后关闭表示主体的流量),因此尝试以同样的方式重复使用@RequestBody没有意义,因为流已经关闭了。
/ G8 {: j. C; _$ w因此,为了解决您的问题,请创建一个包含您指定两个对象的特殊对象。
, G. }7 ], c% mpublic class Complaint {  Claim claim;  List sectors;}然后将方法参数改为:) R& \( B# l3 W' h) e' D" |5 x% w
toCreateClaim(@RequestBody Complaint complaint)另外,如果要用的话@Valid验证对象的结构并使结果可访问,需要在验证参数后添加BindingResult:4 J0 _& r3 ^) R( {+ I3 c% q) x
toCreateClaim(@Valid @RequestBody Complaint complaint,BindingResult bindingResult)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则