在Spring(Boot)应用程序中,我们大量使用Pageable
接口,并且我们的控制器方法大多定义如下:
public ResponseEntity<List<Thing>> fetchAll(Pageable pageable) {
Page things = this.thingService.findAll(pageable);
return new ResponseEntity<>(things.getContent(), HttpStatus.OK);
}
通过以下端点访问时:
/api/things/?size=5&page=1&sort=name,asc
如果sort属性(在这种情况下为name
)拼写错误或不存在,则抛出PropertyReferenceException
并将500发回给用户,并显示以下消息:
{
"timestamp": "2017-01-30 13:40:47",
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.data.mapping.PropertyReferenceException",
"message": "No property name found for type Thing!",
"path": "/api/things"
}
虽然这在技术上是正确的错误消息,但似乎500不是适当的代码来响应。 5xx级别的消息通常是为服务器问题保留的,这在技术上是用户问题,因此更像是4xx级别的消息。
最好我可以看到它是否只是一个400.我的问题是a)在这种情况下400是一个适当的反应和b)有一种优雅的方式来处理这个问题。我目前的解决方案是在我的ControllerAdvice
类中捕获该异常并返回400。