如何配置FeignClient使其支持处理参数中的自定义ID类型字段
Feign路径参数填充自定义对象的实现方案
这个需求完全可以通过Feign Client实现。首先要明确:@JsonValue是Jackson提供的注解,仅作用于JSON序列化/反序列化场景,Feign填充路径变量的逻辑默认不依赖Jackson序列化,所以需要额外做适配,具体有两种可选实现方案:
方案1:重写自定义类的toString方法(成本最低)
Feign默认会调用参数对象的toString()方法来填充路径变量,所以只需要做两处修改:
- 给Feign接口的参数加上
@PathVariable注解,绑定路径变量名:
@RequestMapping(method = RequestMethod.DELETE, value = "/spaces/{spaceId}") void deleteSpace(@PathVariable("spaceId") SpaceId spaceId);
- 重写
SpaceId类的toString()方法返回id字段值:
public class SpaceId implements Serializable { @JsonValue String id; @Override public String toString() { // 增加空判避免空指针异常 return id == null ? "" : id; } }
该方案无需额外配置,修改完成后调用deleteSpace(new SpaceId("1"))就能得到DELETE /spaces/1的请求路径。
方案2:自定义类型转换器(无侵入原有类)
如果你不想修改SpaceId类的原有逻辑,可以通过注册自定义类型转换器实现,Spring Cloud Feign会自动识别Spring上下文中的Converter用于参数转换:
- 首先给
SpaceId类添加id字段的getter方法:
public class SpaceId implements Serializable { @JsonValue String id; public String getId() { return id; } }
- 注册自定义转换器:
@Component public class SpaceIdToStringConverter implements Converter<SpaceId, String> { @Override public String convert(SpaceId source) { return source == null ? "" : source.getId(); } }
- 同样给Feign接口参数加上
@PathVariable注解即可,无需其他修改。
内容的提问来源于stack exchange,提问作者mmdc
相关产品推荐
相关产品推荐

