Я пытаюсь добавить проверку схемы JSON, чтобы очистить вводимые пользователем данные для приложения Java. Вся схема хранится в файловой системе, которая выполняет проверку. Моя схема выглядит примерно так:
{
"$id": "https://www.my-url.org/schemas/schemaName.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Train Approximation",
"type": "object",
"properties":{
"settings":{
"type":"object",
"oneOf":[
{"$ref":"https://www.my-url.org/anotherSchema.json"}
]
}
}
}
(В «oneOf» есть дополнительные элементы, а также другие свойства и описания, которые не имеют отношения к делу.)
Я использую Everit библиотека для проверки схемы. Мой код для проверки схемы выглядит так:
String[] schemaNames = {"schemaName.json","anotherSchema.json", "moreSchemasEtc.json"};
String schemaFile = schemaName + ".json";
File fSchemaFile = new File(dir.getAbsoluteFile() + File.separator + schemaFile);
if (fSchemaFile.exists()) {
try (InputStream inputStream = new FileInputStream(fSchemaFile)) {
JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream));
SchemaLoaderBuilder slb = SchemaLoader.builder()
.schemaClient(SchemaClient.classPathAwareClient())
.schemaJson(rawSchema)
.resolutionScope("classpath://Schema");
for(String schemaFileName : schemaNames) {
File tSchemaFile = new File(dir.getAbsoluteFile() + File.separator + schemaFileName);
InputStream inStream = new FileInputStream(tSchemaFile);
JSONObject rawTSchema = new JSONObject(new JSONTokener(inStream));
slb.registerSchemaByURI(new URI("https://www.my-url.org/schemas/"+schemaFileName), rawTSchema);
}
SchemaLoader schemaLoader = slb.build();
Schema schema = schemaLoader.load().build();
schema.validate(new JSONObject(jsonString));
} catch (ValidationException e) {
//Do error handling
}
} else { /* Do other stuff */ }
Это работает для всех моих схем, которые не имеют внешних ссылок. (Например: "$ref":"https://www.my-url.org/anotherSchema.json"
) Для схемы, подобной той, которую я разместил здесь, я получаю java.io.FileNotFoundException
с путем из ссылки.
Что я здесь делаю не так? Я также пробовал: -Использовать клиент, поддерживающий путь к классам (все еще в коде выше) и добавить родительский каталог над моим /Schema/
каталогом в мой Java путь к классам, а затем ссылаться на все как, например, "$ref":"anotherSchema.json"
вместо того, чтобы иметь весь путь - Использование пути my-url.org
в области разрешения вместо пути к классам
С параметром пути к классам я получаю сообщение об ошибке, имеющее путь вроде classpath://Schema/anotherSchema.json
в исключении FileNotFoundException, но тем не менее исключение.