7

我们有一些移动客户端正在使用的 Web 服务,其中移动客户端发出一些请求,我们向它们返回响应。不知何故,如果客户端提出任何无效请求,我们将抛出 Custom Exceptions。但最近移动客户端提出了一些超出变量
范围的请求。客户端对于 ex :: 有不同的变量Long

    {
      "accountId":"343"
      "Amount":"90909090909090909090"
    }

如果accountId 或 Amount的值超过 19 位,我们会得到HttpMessageNotReadable异常,因为范围超出了 long 值。但是从异常中我无法获取针对哪个变量引发了异常,无论是 foraccountId还是Amount。从异常中,我在_path变量中获取此信息,但我无法获取它。 在此处输入图像描述

在路径变量中,我得到类似:

[com.Upload["AccountInfo"], com.Info["Account"]]

有人知道如何获取此信息。

4

2 回答 2

4

以下代码打印出导致异常的字段。

InvalidFormatException invalidFormatException = (InvalidFormatException) exception
        .getCause();
System.out.println(invalidFormatException.getPath().get(0)
        .getFieldName());
于 2016-01-28T06:56:20.643 回答
1

@ArunM 的答案只要该字段处于 1 级即 OP 给出的示例中就有效。

但是当字段在嵌套 json 中时会发生什么?paymentType在下面的例子中说有错误的价值?

{
  "userType": "CUSTOMER",
  "payment": {
                 "amount": 123456,
                 "paymentType": "INTERNET_BANKING"
              }
}

在上面的示例中,如果 的值有任何问题userType,则 中将只有一个元素_path

但是,如果付款中的任何值是错误的,例如,变量paymentType中将有多个元素。_path每个元素表示层次属性。

因此对于paymentType,_path将有 2 个元素,如下图所示:

_path[0].fieldName = "payment"
_path[1].fieldName = "paymentType"

因此,正确的方法是获取最后一个元素,_path如下所示。如果需要,我们可以使用所有元素构建完整的路径。

InvalidFormatException ifx = (InvalidFormatException) exception.getCause();
System.out.println(ifx.getPath().get(ifx.size() - 1).getFieldName());

我相信这是获取无效属性名称的正确方法。

于 2021-02-26T10:15:43.000 回答