Spring Boot 400如果Pageable无法解析

rur96b6h  于 2023-06-05  发布在  Spring
关注(0)|答案(1)|浏览(182)

最近我听说了一个bug。测试人员执行了以下请求:

curl -X 'GET' 'http://zones:26081/zones/vehicles-by-day?date=2023-05-20&page=0&size=10&sort=string'

500个错误的答案:

{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"No property 'string' found for type 'VehiclesByDayEntity'","instance":"/zones/vehicles-by-day"}

但是她期望400的状态是合理的。如果org.springframework.data.domain.Pageable无法解析,则应将其视为错误请求。
下面是@RestController代码的摘录:

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
);

有没有一种方法可以检测(拦截)解析错误并返回400状态而不是500?
例如,如果我在请求中使用了一个错误的日期值,我将得到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"}

为什么Pageable不一样

deyfvvtc

deyfvvtc1#

您可以实现自己的异常处理程序来完成此操作。抛出的异常是PropertyReferenceException。例如,你可以这样写:

@ExceptionHandler(PropertyReferenceException.class)
public ErrorResponse propertyReferenceExceptionHandler(PropertyReferenceException ex) {
    return ErrorResponse.create(ex, HttpStatus.BAD_REQUEST, ex.getMessage());
}

将其添加到您的控制器中,或者添加到用@ControllerAdvice注解的类中。

相关问题