解决FeignClien调用过程中,使用@JsonProperty注解导致参数接收不到
- 使用场景
- 使用的技术是
spring-kcloud
服务,并使用feignClient
组件 - 在对接第三方的时候发现他们的请求参数和返回参数大小写都有,不易阅读,也不符合公司的编码规范,就采用了
@JsonProperty
对属性进行处理 - 单个应用使用
@JsonProperty
的时候并没有问题,结果和我们想要的一样
接收不到参数的场景
- 当我们对接三方的服务,就叫(
provider-third-server
)吧,然后我们的api服务,就叫(app-api
) 吧 - 请求参数类,第三方参数全是大写开头,我们要转换为小写
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 封装第三方接口请求类
*
* @author liouwb
* @time 2022-09-26
*/
@Data
@ApiModel("封装第三方接口请求类")
public class ThirdParam {
@ApiModelProperty(value = "姓名", required = true, position = 1)
private String name;
@ApiModelProperty(value = "年龄", required = true, position = 2)
private Integer age;
}

- 通过上图可以看到,thirdParam经过了多次序列化和反序列化。这时想
app-api
j接收到的前端参数是小驼峰,传给provider-third-server
,provider-third-server
传给第三方的时候是大写开头,这个时候单个@JsonProty
就满足不了了
解决方案
- 思路:反序列化的时候使用
@JsonAlias
注解可以接收大写和小写参数,序列化的时候使用JsonProperty
注解序列化为大写,我们的请求的在使用的使用也是小驼峰符合代码规范的
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 封装第三方接口请求类
*
* @author liouwb
* @time 2022-09-26
*/
@Data
@ApiModel("封装第三方接口请求类")
public class ThirdParam {
@ApiModelProperty(value = "姓名", required = true, position = 1)
private String name;
@ApiModelProperty(value = "年龄", required = true, position = 2)
private Integer age;
@JsonProperty("Name")
public String getName() {
return name;
}
@JsonAlias(value = {"name", "Name"})
public void setName(String name) {
this.name = name;
}
@JsonProperty("Age")
public Integer getAge() {
return age;
}
@JsonAlias(value = {"age", "Age"})
public void setAge(Integer age) {
this.age = age;
}
}
- 这样我们就可以使用同一个类,接收前端传递的
name
参数,经过feignclient或者其他请求调用的时候经过处理,最后调用三方服务的时候传递Name
参数