使用 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 的字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从可枚举转换为特定模型

Java将字符串转换为枚举列表[重复]

将枚举转换为核心 2.1 剃须刀页面中的下拉列表

将哈希表转换为 OCaml 中的对列表(键、值)

JSON 序列化 - 将枚举转换为数字

feign date类型时间错误问题