使用 feign 客户端将枚举列表转换为 Spring @RequestParam 的字符串列表
Posted
技术标签:
【中文标题】使用 feign 客户端将枚举列表转换为 Spring @RequestParam 的字符串列表【英文标题】:Convert List of Enums to List of String for Spring @RequestParam using feign client 【发布时间】:2022-01-12 22:57:09 【问题描述】:我有一个这样的枚举类:
ONE("1", "Description1"),
TWO("2", "Description2");
String value;
String description;
MyEnum(String value, String description)
this.value = value;
this.description = description;
@Override
public String toString()
return this.value;
@JsonValue
public String value()
return this.value;
我正在与之交互的 API 需要一个 String 类型的参数,并且值可以用逗号分隔。
例如:api.com/test?param1=1,2
我用 url api.com/test
配置了一个 feign 客户端
然后像这样创建了一个 POJO
public class POJO
private List<MyEnum> param1;
在我的假客户中,我有:
@RequestMapping(method = RequestMethod.GET)
MyResponse getResponse(@SpringQueryMap POJO request);
在通过某种 Spring 方法进行 API 调用之前,是否可以以某种方式将枚举列表转换为字符串列表?
截至目前,当我传递一个枚举列表时,它只考虑此列表中的最后一个枚举。
更新:我使用@JsonSerialize(converter=abc.class) 注释了要转换为列表的属性。但是@SpringQueryMap 似乎并不尊重该序列化..
【问题讨论】:
【参考方案1】:可以,您需要创建一个拦截器并在该方法中进行映射。 这个话题可能适合你。
Spring - Execute code before controller's method is invoked
【讨论】:
请提供更多详细信息,说明您的答案对原始问题的实际帮助。谢谢!【参考方案2】:原来@JsonSerialize 不能与@SpringQueryMap 一起使用 所以我确实必须添加一个拦截器。
像这样:
public class MyInterceptor implements RequestInterceptor
@Override
public void apply(RequestTemplate requestTemplate)
if(requestTemplate.queries().containsKey("param1"))
requestTemplate.query("param1", convert(requestTemplate.queries().get("param1")));
//convert list to a string
public String convert(Collection<String> values)
final String s = String.join(",", values.stream().map(Object::toString).collect(Collectors.toList()));
return s;
然后在我的 Feign 配置类中添加了这个:
@Bean
public MyInterceptor myInterceptor()
return new MyInterceptor();
【讨论】:
以上是关于使用 feign 客户端将枚举列表转换为 Spring @RequestParam 的字符串列表的主要内容,如果未能解决你的问题,请参考以下文章