读取输入消息时发生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) |
|
|
|
|
|