HTTP异常处理过程中如何从请求中获取邮政body



我有2个微服务。其中1个将请求发送给2,2微服务会引发异常,并将新的添加字段 errors 添加到使用有用数据的响应中:

    public static class ErrorResponse  {
        private Integer status;
        private String transactionId;
        private String sessionId;
        private String message;
        private List<FieldError> errors;
    //....setters/getters
    }
{
    "status": 400,
    "message": "Validation failed for object='x'. Error count: 1",
    "sessionId": "",
    "transactionId": "xxx",
    "errors": [
        {
            "codes": [
                ""
            ],
            "arguments": null,
            "defaultMessage": null,
            "objectName": "",
            "field": "",
            "rejectedValue": 0,
            "bindingFailure": false,
            "code": "invalid value"
        }
    ]
}

在1个微服务中,我有一个全局异常处理程序,它将其发送到客户端,但问题是我无法从 httpservletrequest 中获取 errors 。getReader()方法引发了另一个异常。结果,客户获得了

{
    "status": 400,
    "message": "Validation failed for object='x'. Error count: 1",
    "sessionId": "",
    "transactionId": "xxx",
    "errors": null
}

您无法第二次调用GetReader。此链接说明原因:调用request.getReader()后重置httprequest。如果该信息通过应用程序全局使用,则可以通过本地线程传递此信息。您需要确保适当地重置本地线程。您还可以捕获以前的异常,将其包裹在自定义类别中,然后将此信息放入您的自定义异常中。然后,您可以抛出具有所需信息的自定义异常。

解决方案是实现ErrordeCoder接口和覆盖

@Override
Exception decode(String methodKey, Response response) {
    // response has getBody() method to get all data from a request 
}

最新更新