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