Recently I was informed about a bug. The tester executed the following request:
curl -X 'GET' 'http://zones:26081/zones/vehicles-by-day?date=2023-05-20&page=0&size=10&sort=string'
And got 500 error in response:
{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"No property 'string' found for type 'VehiclesByDayEntity'","instance":"/zones/vehicles-by-day"}
However she expected a 400 status which is reasonable. If org.springframework.data.domain.Pageable cannot be parsed it should be considered as a bad request.
Below is the excerpt from the @RestController code:
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
...
@GetMapping(value = "/vehicles-by-day", produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<VehiclesByDay200Response> getVehiclesByDay(
@Parameter(name = "date", description = "The date vehicles by day which for")
@RequestParam(value = "date", required = false) LocalDate date,
@Parameter(name = "pageable", in = ParameterIn.QUERY)
@PageableDefault Pageable pageable
);
Is there a way to detect (intercept) the parsing error and return the 400 status instead of 500 ?
For example if I use a wrong date value in the request I'll get 400.
curl -X 'GET' 'http://zones:26081/zones/vehicles-by-day?date=2023-05-aa&page=0&size=10'
{"type":"about:blank","title":"Bad Request","status":400,"detail":"Failed to convert 'null' with value: '2023-05-aa'","instance":"/zones/vehicles-by-day"}
Why is it different with Pageable.
You can implement your own exception handler to do this. The exception that's being thrown is
PropertyReferenceException. For example, you could write something like this:Either add this to your controller, or to a class annotated with
@ControllerAdvice.