2022年8月更文挑战3-由于不存在无参构造方法导致的feign调用失败

148 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

由于不存在无参构造方法导致的feign调用失败

前文

本文为一次feign请求调用失败的记录,主要原因是由于反序列化时不存在无参构造方法导致的问题。

问题内容

进行了一次feign请求的调用,在调用后发现feign请求曝出异常,因此进行了异常信息的查看。

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class Error]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `Error` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

根据上述的错误内容可以看出,该错误原因是由于我们结果类中的Error不存在默认的构造方法,实际上也就是无参构造方法,在反序列化的过程中抛出异常。下面看一下我们的Error类构造方法部分:

private String code;
private String message;

public Error(ExceptionEnum exceptionInfoEnum) {
    this.code = exceptionInfoEnum.getErrorCode();
    this.message = exceptionInfoEnum.getErrorMessage();
}

public Error(String errorCode, String errorMessage) {
    this.code = errorCode;
    this.message = errorMessage;
}

如上所示即为error类的构造方法部分,可以看出其中是不包含无参构造方法的,也就是这个原因导致了我们的调用失败。当我们在error类中增加无参构造方法后,这里采用另一个类进行对比,类中参数与Error类完全一致但包含无参构造方法,我们可以看到执行结果如下:

{
  "success": true,
  "body": {
    "success": false,
    "error": {
      "code": "2003",
      "message": "参数类型不匹配"
    }
  }
}

如上,通过一个自定义的包含无参构造方法的类,可以看出我们已经成功的将执行结果进行反序列化,得到目标的对象,同时避免了上述的反序列化异常的问题。

上述的问题只是表现于feign调用时发生,而实际上,对于反序列化来说,在任何时候都需要目标对象包含无参构造函数。如果无参构造函数被屏蔽,也就会出现无法反序列化的异常。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。