读取输入消息时出现 I/O 错误;嵌套异常是 java.io.IOException: Stream closed

Dan*_*ira 7 java sql spring spring-mvc

这是我的控制器:

@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;
        
    }
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

"message": "读取输入消息时出现 I/O 错误;嵌套异常为 java.io.IOException: Stream closed"

Mac*_*eyo 15

您的错误是 @RequestBody 在您的控制器方法参数中被使用两次的结果。以下行导致问题:

toCreateClaim(@Valid @RequestBody Claim claim, @RequestBody List<Sector> sectors)
Run Code Online (Sandbox Code Playgroud)

您不能以这种方式使用它,因为每个方法只允许一个 @RequestBody。使用 @RequestBody Spring 将传入的请求正文转换为指定的对象(最后关闭表示正文的流),因此尝试在同一方法中第二次使用 @RequestBody 毫无意义,因为流已经关闭。

因此,为了解决您的问题,请使用您指定的两个对象创建一个专用对象。喜欢:

public class Complaint {
  Claim claim;
  List<Sector> sectors;
}
Run Code Online (Sandbox Code Playgroud)

然后将方法参数更改为:

toCreateClaim(@RequestBody Complaint complaint)
Run Code Online (Sandbox Code Playgroud)

此外,如果要使用 @Valid 验证对象的结构并使结果可访问,则需要在验证的参数之后添加 BindingResult :

toCreateClaim(@Valid @RequestBody Complaint complaint, BindingResult bindingResult)
Run Code Online (Sandbox Code Playgroud)