Внешняя ссылка при проверке JSON с помощью Everit дает "FileNotFoundException" - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь добавить проверку схемы 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, но тем не менее исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...