我没有找到任何合适的解决方案,所以也许你可以提供帮助。基本上问题非常简单,我想在使用 QuerydslPredicate 时进行某种“更好看”的错误处理
我有 ID 为数字格式的实体(在数据库端) - 在实体级别,它的私有 Long id。
在正常获取所有内容时出现了我的问题(如预期的场景):
- /testEndpoint&pageSize=100&id=1
- /testEndpoint&pageSize=100&id=1123123
一切都很好。但是当我输入非数字 value 到像 id=randomTest 这样的 id 时,我得到了 NumberFormatException
@GetMapping
public ApiResponsePage listTest(
@RequestParam(defaultValue = "0") final Integer pageNo,
@RequestParam(defaultValue = "10") final Integer pageSize,
@RequestParam(defaultValue = "id") final String sortBy,
@QuerydslPredicate(root = TestEntity.class) final Predicate predicate
) {
final Page<TestEntity> all = testEntityRepo.findAll(predicate);
return all;
}
案例是这个异常是在解析级别引发的,所以它甚至没有达到 testEntityRepo.findAll(predicate);。有没有办法以更“优雅”的方式处理此类异常?所以我可以放一些自定义消息等?
日志:
INFO 18388 --- [main] d.v.s.a.s.e.DefaultExceptionReporter:GET /testEndpoint 导致无法从类型 [java.lang.String] 转换为类型 [@javax.persistence.Id java.lang.Long] value 'testRandomValue';嵌套异常是 java.lang.NumberFormatException: For input string: "testRandomValue"
回答1
一种选择是制作 exceptionHandler:
@ExceptionHandler(ConversionFailedException.class)
public ResponseEntity conversionFailedException(ConversionFailedException ex) {
return ResponseEntity
.badRequest()
.contentType(APPLICATION_JSON_UTF8)
.body(createResponseBody(ex.getMessage()));
}
这是有效的,但它会采取这种类型的所有错误,所以如果你有任何其他地方出现它可能是开销