Spring Boot中能否通过JSON属性映射GET请求参数至实体字段?
问题分析与解决办法
核心问题:你使用的@JsonProperty是Jackson框架用于处理JSON请求体序列化/反序列化的注解,而GET请求的查询参数属于URL表单参数范畴,Spring MVC处理这类参数绑定到实体类时,不会识别@JsonProperty,导致xqId字段始终为null。
以下是三种可行的解决方式:
1. 用Spring原生@RequestParam指定参数映射
直接在实体类的xqId字段上添加@RequestParam注解,明确指定要绑定的URL参数名:
@Data @Accessors(chain = true) public class BaCyxxReq extends PageReq { private String keyword; @NotBlank(message = "xq_id can not be null") @RequestParam("xq_id") private String xqId; }
接口依旧使用@ModelAttribute即可正常绑定参数。
2. 配合@SpringQueryMap使用Jackson蛇形命名策略
在实体类上添加@JsonNaming注解,开启蛇形命名(下划线转驼峰)的自动映射,再搭配@SpringQueryMap使用:
@Data @Accessors(chain = true) @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) public class BaCyxxReq extends PageReq { private String keyword; @NotBlank(message = "xq_id can not be null") private String xqId; }
接口代码保持:
@GetMapping("/hqcyxx") PageResult<List<QlrDTO>> getAreaMembers(@Valid @SpringQueryMap BaCyxxReq req);
此时@SpringQueryMap会借助Jackson的命名策略,自动将xq_id映射到xqId字段。
3. 配置全局参数绑定的驼峰转下划线规则
如果需要所有实体类都支持下划线参数转驼峰字段的自动映射,可以编写WebMvc配置类自定义转换规则:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCamelCaseConverter()); } static class StringToCamelCaseConverter implements Converter<String, String> { @Override public String convert(String source) { if (source == null || source.isBlank()) { return source; } StringBuilder sb = new StringBuilder(); boolean needUpper = false; for (char c : source.toCharArray()) { if (c == '_') { needUpper = true; } else { sb.append(needUpper ? Character.toUpperCase(c) : c); needUpper = false; } } return sb.toString(); } } }
配置完成后,无论使用@ModelAttribute还是@SpringQueryMap,URL中的xq_id都会自动映射到实体类的xqId字段。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

