今天配置Gateway在网关进行token校验的时候报出了一个bug,内容如下
feign.codec.DecodeException: Error while extracting response for type [class com.doria.common.pojo.vo.HttpResult] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type
com.doria.common.ad_enum.CodeEnumfrom number 20000: index value outside legal index range [0..10]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type
com.doria.common.ad_enum.CodeEnumfrom number 20000: index value outside legal index range [0..10] at [Source: (PushbackInputStream); line: 1, column: 21] (through reference chain: com.doria.common.pojo.vo.HttpResult["code"])
似乎是反序列化的时候出现了问题
检查步骤:
1:是否有配置一个空参构造
2:是否提供了原始的set&get方法
3:是否提供了原始的有参构造方法
原因:
我这里 由于使用枚举进行响应,所以接收的参数是枚举类,然后在里面根据语言类型进行取值并赋值给msg,所以set方法是我自定义的,所以导致了这个bug。
解决:
在pojo里改成了原始的set方法;接收数据类型和成员类型一致;
最后尝试了一下两种set都提供的方案,
结果报错另一个,有大佬能说说为啥吗
Could not extract response: no suitable HttpMessageConverter found for response type [class com.doria.common.pojo.vo.HttpResult] and content type [application/json]
后续解决:
反序列化似乎会加载所有的setXXX方法进行尝试,一旦加载到这个枚举,他就无法判断加载什么内容就会报错;而我这个set方法本身就是我自己用的,所以不希望他加载,那我就改了个名字;解决了;
总结:
如果要进行序列化,set方法不支持重载;;;另外,,尽量不要在pojo中加逻辑