feign调用过程
- SynchronousMethodHandler 执行 invoke 方法
- 构建 RequestTemplate 对象
- 解析 QueryMap 使用 queryMapEncoder.encode(value)
- QueryMapEncoder 实现类 FieldQueryMapEncoder 类
public Map<String, Object> encode(Object object) throws EncodeException {
try {
FieldQueryMapEncoder.ObjectParamMetadata metadata = this.getMetadata(object.getClass());
Map<String, Object> fieldNameToValue = new HashMap();
Iterator var4 = metadata.objectFields.iterator();
while(var4.hasNext()) {
Field field = (Field)var4.next();
Object value = field.get(object);
if (value != null && value != object) {
Param alias = (Param)field.getAnnotation(Param.class);
String name = alias != null ? alias.value() : field.getName();
fieldNameToValue.put(name, value);
}
}
return fieldNameToValue;
} catch (IllegalAccessException var9) {
throw new EncodeException("Failure encoding object into query map", var9);
}
}
- Param alias = (Param)field.getAnnotation(Param.class); 通过@Param注解别名生成key
使用下划线传参:
- 参数实体类
@Data
public class TbRecPointReq {
@Param("user_id")
private Long userId;
private Integer count;
@Param("device_id")
private String deviceId;
@Param("app_id")
private Integer appId;
}
- 返回值实体类,使用 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
@Data
public class TbRecResp {
private List<PointResp> items;
@Data
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public static class PointResp {
private String id;
private String author;
private String xRec;
}
}
- feign client 接口
@FeignClient(url = "${rec.domain:http://127.0.0.1:8888}", name = "rec-tb-point", contextId = "Rec-Point-Feign-Client")
public interface PointRecFeignApiClient {
@GetMapping(value = "/point")
R<TbRecResp> recTb(@SpringQueryMap TbRecPointReq req);
}