一、post请求使用对象传参时字段名首字母自动变小写
因为以往接口字段名一般首字母都是小写,所以从未遇到过问题,但是这次字段名均为全大写,调用接口时一直返回参数异常。经过排查发现,传参的字段名全部变成了首字母小写。
原因
restTemplate使用jackson序列化,jackson的属性发现机制为:
被public修饰的字段 >> 被public修饰的getter >> 被public修饰的setter
我的属性都是私有的,所以Jackson是通过我的get方法获取的字段名,而java的内省机制,导致了我字段名首字母小写。
内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量,通过去掉set方法前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写。
解决方案
- 使用Gson序列化,Gson是直接使用字段名
- 直接使用Map传参,不使用实体类
- 在实体类上加注解:@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.ANY,getterVisibility= JsonAutoDetect.Visibility.NONE),表示设置字段属性可见而取消get检测
二、postForObject接收参数时报转换错误
我们一般在对接三方接口时,已知响应参数的情况下会使用对象接收。
然而我在接收过程中遇到了问题,对方响应的是application/octet-stream,对象是无法接收的。
我目前的解决方案是直接使用String接收,再去解析json字符串