You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Feign使用@SpringQueryMap时如何将GET参数转为蛇形命名?

解决方案

方法一:Jackson命名策略 + Feign Jackson查询参数编码器

这是最简洁的方案,利用Jackson的命名策略自动转换属性名:

  1. 修改EventParameters实体类,改用驼峰命名属性,同时添加@JsonNaming注解指定蛇形转换规则:
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class EventParameters {
    private String orderBy;
    private String sort;
    private String startAt;
    private String endAt;

    // 生成对应的getter、setter方法
}
  1. 在Spring Boot配置文件(application.yml或application.properties)中配置Feign使用Jackson处理查询参数:
feign:
  query-map-encoder: jackson

配置完成后,Feign处理@SpringQueryMap注解的实体时,会自动将驼峰属性名转为蛇形请求参数,完全匹配外部API要求。

方法二:自定义QueryMapEncoder(复杂场景适配)

如果不想依赖Jackson配置,可以自定义编码器实现属性名转换:

  1. 实现Feign的QueryMapEncoder接口,编写驼峰转蛇形的逻辑:
import feign.QueryMapEncoder;
import feign.codec.EncodeException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class SnakeCaseQueryMapEncoder implements QueryMapEncoder {
    @Override
    public Map<String, Object> encode(Object object) throws EncodeException {
        Map<String, Object> params = new HashMap<>();
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                Object value = field.get(object);
                if (value != null) {
                    String snakeCaseName = camelToSnakeCase(field.getName());
                    params.put(snakeCaseName, value);
                }
            } catch (IllegalAccessException e) {
                throw new EncodeException("Failed to encode query map", e);
            }
        }
        return params;
    }

    private String camelToSnakeCase(String camelCase) {
        return camelCase.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
    }
}
  1. 配置Feign客户端使用自定义编码器:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.QueryMapEncoder;

@Configuration
public class FeignConfig {
    @Bean
    public QueryMapEncoder queryMapEncoder() {
        return new SnakeCaseQueryMapEncoder();
    }
}
  1. 修改EventParameters为驼峰命名属性即可,无需额外注解:
public class EventParameters {
    private String orderBy;
    private String sort;
    private String startAt;
    private String endAt;

    // getter、setter方法
}

方法三:逐个参数使用@RequestParam(参数较少场景)

如果实体参数不多,可直接放弃@SpringQueryMap,逐个声明参数并指定蛇形参数名:

public interface FeignClient {
    @GetMapping("/events/query")
    EventCollectionResponse getAplomadoEvents(
            @RequestParam("order_by") String orderBy,
            @RequestParam("sort") String sort,
            @RequestParam("start_at") String startAt,
            @RequestParam("end_at") String endAt
    );
}

这种方式直接但参数较多时会显得繁琐,适合简单场景。


内容的提问来源于stack exchange,提问作者Markas Sislo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:29:54