This is my controller:
@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;
}
This is the error I get:
"message": "I/O error while reading input message; nested exception is java.io.IOException: Stream closed"
Your error is the result of @RequestBody being used twice in your controller method arguments. Following line causes the issue:
toCreateClaim(@Valid @RequestBody Claim claim, @RequestBody List<Sector> sectors)
You cannot use it this way as only one @RequestBody per method is allowed. Using @RequestBody Spring converts incoming request body into the specified object (what closes the stream representing body at the end) so attempting to use @RequestBody second time in the same method makes no sense as stream has been already closed.
So in order to solve your issue, please create a dedicated object with both objects which you specified. Like:
public class Complaint {
Claim claim;
List<Sector> sectors;
}
And then change method arguments to:
toCreateClaim(@RequestBody Complaint complaint)
What is more, if you want to validate the structure of your object using @Valid and make the result accessible, you need to add BindingResult just after the argument which is validated:
toCreateClaim(@Valid @RequestBody Complaint complaint, BindingResult bindingResult)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With