回答

收藏

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

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

这是我的控制器:
: i. W  v4 {6 P) s! W* ?@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;    }这是我得到的:
) D- s# R9 n9 M# h! f( Z) {. \6 e  U“ messageI / O错误;异常嵌套java.io.IOException:流已关闭”: U" U* z& \. y. d5 T# k
                                                                $ D. p; g! g: W1 D9 ~
    解决方案:                                                                ; ~* ]5 S- c& R, @3 e, T
                                                                您的错误是@RequestBody两次使用控制器方法参数的结果。这个问题是由以下行动引起的:8 |$ f( Y5 N/ e2 x- v- J7 T+ j6 a
toCreateClaim(@Valid @RequestBody Claim claim,@RequestBody List sectors)你不能这样用,因为每种方法只允许一种@RequestBody。使用@RequestBody
' V, C5 F7 U( l% [  \$ N) [Spring将传输的请求主体转换为指定的对象(在最后关闭表示主体的流量),因此尝试以同样的方式重复使用@RequestBody没有意义,因为流已经关闭了。8 @6 t6 x7 h7 Q9 e
因此,为了解决您的问题,请创建一个包含您指定两个对象的特殊对象。2 ~4 i; O6 h* v5 I; K
public class Complaint {  Claim claim;  List sectors;}然后将方法参数改为:1 h4 k2 D8 c% A& ]6 m
toCreateClaim(@RequestBody Complaint complaint)另外,如果要用的话@Valid验证对象的结构并使结果可访问,需要在验证参数后添加BindingResult:
$ x1 w: I! q' [6 A8 l! g0 ^! NtoCreateClaim(@Valid @RequestBody Complaint complaint,BindingResult bindingResult)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则