如何配置Jackson反序列化时字段大小写错误直接抛出异常
问题结论
无法仅通过Jackson现有默认配置实现该需求。
你当前遇到大小写错误的键名不触发报错、对应字段赋值为null的核心原因:
- 你使用的
SnakeCaseStrategy命名策略,反序列化时会先尝试将传入的JSON键名转换为标准蛇形/驼峰映射格式再和Java字段匹配,cLient包含大写字符,转换后会生成c_lient,和目标字段client期望的键名client无法匹配。 - 你仅配置了
FAIL_ON_UNKNOWN_PROPERTIES = true,但没有显式关闭所有宽松匹配规则,部分Jackson版本搭配命名策略使用时,存在大小写模糊匹配的兼容逻辑,不会将大小写错误的键识别为未知属性,最终导致字段未被赋值也不抛错。
实现方案
推荐两种可落地的方案,按需选择:
方案1:自定义严格蛇形命名策略(无额外依赖)
重写蛇形命名策略的键名解析逻辑,在反序列化阶段校验传入的JSON键是否完全符合标准蛇形命名格式(全小写+下划线分隔),只要存在大小写错误直接抛出异常,同时显式关闭所有Jackson的宽松匹配配置。
代码实现
- 自定义严格校验的命名策略:
import com.fasterxml.jackson.databind.PropertyNamingStrategies; public class StrictSnakeCaseStrategy extends PropertyNamingStrategies.SnakeCaseStrategy { @Override public String translate(String input) { // 按标准蛇形规则转换传入键名 String standardName = super.translate(input); // 原始传入值和标准全小写蛇形名不一致,说明存在大小写/格式错误 if (!input.equals(standardName)) { throw new IllegalArgumentException("JSON键名不符合规范:" + input + ",期望键名:" + standardName); } return standardName; } }
- 修改ObjectMapper配置,替换原命名策略,显式关闭所有宽松匹配:
public static <T> T fromJson(String json, Class<T> clazz) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper() // 遇到未知属性直接抛错 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true) // 显式关闭属性名大小写不敏感匹配 .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, false) // 显式关闭枚举值大小写不敏感匹配 .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, false) // 注册自定义严格蛇形命名策略 .setPropertyNamingStrategy(new StrictSnakeCaseStrategy()); return mapper.readValue(json, clazz); }
- 将
Header类上的@JsonNaming注解替换为自定义策略:
@Data @JsonNaming(StrictSnakeCaseStrategy.class) @JsonIgnoreProperties(ignoreUnknown = false) public class Header { private String myName; private String client; private String createdOn; private String updatedOn; }
该方案无额外依赖,性能损耗极低,和原有Jackson使用逻辑完全兼容。
方案2:JSON Schema前置校验(校验逻辑最严谨)
如果需要对JSON格式做全链路严格校验(包括键名大小写、字段类型、必填规则、值格式等),可以在反序列化前增加JSON Schema校验步骤:
- 先编写和
Header类对应的JSON Schema文件,明确定义每个字段的精确键名、类型 - 反序列化前先用Schema校验传入的JSON字符串,只要键名大小写和Schema定义不一致,直接抛出校验错误
- 校验通过后再走原有的Jackson反序列化逻辑
该方案优点是校验规则最全面,不会受Jackson版本、配置逻辑变动影响,缺点是需要引入JSON Schema校验依赖,额外维护Schema文件。
注意:不要单独依赖类上的
@JsonIgnoreProperties(ignoreUnknown = false)注解做严格校验,该注解的优先级会受ObjectMapper全局配置影响,无法覆盖所有宽松匹配场景。
内容的提问来源于stack exchange,提问作者JohnnyTheJet
相关产品推荐
相关产品推荐

