java - Spring QuerydslPredicate - 错误类型的异常处理

我没有找到任何合适的解决方案,所以也许你可以提供帮助。基本上问题非常简单,我想在使用 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()));
}

这是有效的,但它会采取这种类型的所有错误,所以如果你有任何其他地方出现它可能是开销

相似文章

随机推荐

最新文章