Spring Feign使用@SpringQueryMap时如何将GET参数转为蛇形命名?
解决方案
方法一:Jackson命名策略 + Feign Jackson查询参数编码器
这是最简洁的方案,利用Jackson的命名策略自动转换属性名:
- 修改
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方法 }
- 在Spring Boot配置文件(
application.yml或application.properties)中配置Feign使用Jackson处理查询参数:
feign: query-map-encoder: jackson
配置完成后,Feign处理@SpringQueryMap注解的实体时,会自动将驼峰属性名转为蛇形请求参数,完全匹配外部API要求。
方法二:自定义QueryMapEncoder(复杂场景适配)
如果不想依赖Jackson配置,可以自定义编码器实现属性名转换:
- 实现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(); } }
- 配置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(); } }
- 修改
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
相关产品推荐
相关产品推荐

