Jackson生成JSON Schema时如何支持value字段多数据类型校验
问题根因
当前使用的Jackson原生JSON Schema生成模块,默认将java.lang.Object类型映射为type: object的空结构约束,和Java中Object可承载任意类型值的语义不匹配,因此传入字符串、数字等非对象类型时会校验失败。
可行解决方案
方案1:自定义Object类型的Schema生成规则
可以通过给Schema生成器注册自定义类型处理器,覆盖默认的Object类型映射逻辑,不需要修改原有Java类定义:
- 如果需要value支持任意合法JSON类型(字符串、数字、布尔、对象、数组均可),就将Object类型映射为无类型约束的Schema节点,参考代码:
JsonSchemaGenerator generator = new JsonSchemaGenerator(objectMapper); generator.setSchemaProvider(new DefaultSchemaProvider(){ @Override public JsonNode createSchema(Class<?> type, SerializationConfig config, Set<Class<?>> processedTypes) { if (Object.class.equals(type)) { // 不添加type约束,即允许任意JSON类型值 return objectMapper.createObjectNode(); } return super.createSchema(type, config, processedTypes); } }); JsonNode schema = generator.generateJsonSchema(FormElement.class);
- 如果value只需要支持String、Integer、Boolean三类基础类型,可以在自定义逻辑中显式声明允许的类型列表,避免非法类型入参:
@Override public JsonNode createSchema(Class<?> type, SerializationConfig config, Set<Class<?>> processedTypes) { if (Object.class.equals(type)) { ObjectNode valueConstraint = objectMapper.createObjectNode(); ArrayNode typeList = objectMapper.createArrayNode() .add("string") .add("integer") .add("boolean"); valueConstraint.set("type", typeList); return valueConstraint; } return super.createSchema(type, config, processedTypes); }
调整后生成的Schema会移除value字段对空Object定义的引用,符合类型要求的入参即可正常通过校验。
方案2:替换为维护中的Schema生成依赖
当前使用的官方jackson-module-jsonSchema模块已经停止维护,仅支持JSON Schema draft-04版本。如果不需要绑定旧版本规范,可以替换为社区活跃维护的JSON Schema生成类库,这类库默认就会将java.lang.Object映射为无类型约束的Schema,不需要额外编写自定义规则,同时支持更高版本的JSON Schema规范。
内容的提问来源于stack exchange,提问作者ecabrera78
相关产品推荐
相关产品推荐

