REST API中未知Enum值被转为null的非空保留方案咨询
解决方案
问题根源
你之前配置的Jackson属性未生效,核心原因是Swagger生成的枚举类中,@JsonCreator注解的fromValue方法完全接管了枚举的反序列化逻辑,Jackson默认的枚举反序列化规则(包括READ_UNKNOWN_ENUM_VALUES_AS_NULL)被覆盖,所以无论怎么配置ObjectMapper,最终都会走这个自定义方法返回null。
具体解决方法
方法1:修改生成的枚举类,返回默认枚举项
在你的MyEnum中新增一个表示“未知值”的枚举项,然后修改fromValue方法,匹配失败时返回该默认项而非null:
public enum MyEnum { // 原有枚举项 HOME("HOME"), WORK("WORK"), // 新增未知值枚举项 UNKNOWN("UNKNOWN"); private final String value; MyEnum(String value) { this.value = value; } @JsonCreator public static MyEnum fromValue(String input) { for (MyEnum b : MyEnum.values()) { if (b.value.equals(input)) { return b; } } // 替换return null,返回自定义的未知枚举项 return MyEnum.UNKNOWN; } }
这样当传入未知枚举值时,会被映射为UNKNOWN,而非null,同时不会抛出异常。
方法2:修改Swagger Codegen模板,避免生成返回null的代码
如果担心Swagger重新生成代码会覆盖修改,可以自定义Swagger Codegen的枚举模板,让生成的fromValue方法默认返回自定义的未知枚举项:
- 找到Swagger Codegen使用的枚举模板(通常是
enum.mustache或类似文件) - 修改模板中
fromValue方法的返回逻辑,将return null替换为返回预设的未知枚举项代码 - 重新生成代码,后续生成的枚举类都会自动使用新的返回逻辑
补充说明
如果不需要保留未知值的具体内容,仅需避免null,方法1是最直接的方案;若需要长期维护代码生成逻辑,方法2能避免重复修改生成的代码。
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

