使用org.jsonschema2pojo时JSON Schema引用重复生成POJO文件问题
解决org.jsonschema2pojo重复生成引用Schema对应的POJO问题
问题场景
使用org.jsonschema2pojo工具将JSON Schema转换为Java POJO时,Schema B通过$ref引用Schema A,但生成B的POJO文件时,工具未复用已生成的A类,反而生成了内容完全一致的重复类,导致无法在多个Schema间复用公共POJO,只能手动强制类型转换。
示例Schema:
Json Schema A:
{ "$schema": "https://json-schema.org/draft/2020-12/schema#", "$id": "https://example.com/schemas/A", "description": "Some Json Schema", "type": "object", "properties": { "genericInfo": { "type": "string", "description": "Some generic info" } }, "required": ["genericInfo"] }
Json Schema B:
{ "$schema": "https://json-schema.org/draft/2020-12/schema#", "$id": "https://example.com/schemas/B", "description": "Some Json Schema B", "type": "object", "properties": { "referenceToA": { "$ref": "../jsonSchemaA.json" } } }
解决方案
1. 改用绝对$id引用
将Schema B中的相对文件路径引用替换为Schema A的$id绝对路径,让工具能识别这是同一个Schema定义:
"referenceToA": { "$ref": "https://example.com/schemas/A" }
2. 配置工具启用类重用策略
Maven插件配置
在pom.xml的插件配置中添加以下参数:
<plugin> <groupId>org.jsonschema2pojo</groupId> <artifactId>jsonschema2pojo-maven-plugin</artifactId> <version>你的工具版本</version> <configuration> <!-- 启用重用已生成的类 --> <reuseExistingClasses>true</reuseExistingClasses> <!-- 基于Schema的$id识别唯一类 --> <useSchemaId>true</useSchemaId> <!-- 禁用用title作为类名,避免冲突 --> <useTitleAsClassName>false</useTitleAsClassName> </configuration> </plugin>
Java API配置
如果直接使用Java API调用工具,设置对应配置项:
GenerationConfig config = new DefaultGenerationConfig() { @Override public boolean isReuseExistingClasses() { return true; } @Override public boolean isUseSchemaId() { return true; } @Override public boolean isUseTitleAsClassName() { return false; } }; // 后续使用该config生成POJO
3. 确保扫描范围包含所有依赖Schema
生成POJO时,将Schema A和Schema B所在的目录都纳入工具的扫描范围,让工具能提前解析到Schema A的定义,处理Schema B时直接复用已生成的类。
问题说明
这是org.jsonschema2pojo的常见问题,根源在于:
- 相对文件路径的
$ref无法被工具识别为指向同一个Schema定义; - 默认配置未启用类重用策略,导致工具遇到相似结构就重新生成类。
内容的提问来源于stack exchange,提问作者learningProgrammer
相关产品推荐
相关产品推荐

