2017-05-19 15 views
0

私のアプリケーションでJsonスキーマを受け取り、後でいくつかのJSONオブジェクトがスキーマに準拠しているかどうかを検証します。私の問題は、もし私が誤ったJsonスキーマを提供しても、例外は発生せず、ログに警告が表示されるということです。 私は例外を投げたい、あるいはどういうわけか警告を考慮に入れたいと思っています。しかし、警告ログは私には静かではないようです。私はJavaとライブラリを使用していますfge json-schemaバリデーターに不明なキーワードのエラーを投げる方法

はJSONスキーマ(「スキーマのスキーマ」)追加のプロパティを許可するので、FGEバリデータのメタスキーマjson-schema

String json = "{\"a\":\"b\"}; 
JsonNode schema = new ObjectMapper().readTree(json); 
JsonSchemaFactory.byDefault().getSyntaxValidator(); 

// this returns true but I want it to return false, since "a" is not a valid keyword 
validator.schemaIsValid(schema); 

// this returns a waning --> the following keywords are unknown and will be ignored: [a] 
System.out.println(validator.validateSchema(schema)); 

答えて

0

私は、未知のプロパティが提供されたときに失敗したとして、検証を考慮することがFGEのバリデータに必要なエラーしきい値を変更することができました。次のコードは作業を行います

void validateSchema(JsonNode schemaNode) throws JsonProcessingException { 

    SyntaxValidator validator = JsonSchemaFactory.byDefault().getSyntaxValidator(); 

    ProcessingReport report = new ListProcessingReport(null, LogLevel.INFO); 
    ValueHolder<SchemaTree> holder = ValueHolder.<SchemaTree>hold("schema", 
     new CanonicalSchemaTree(SchemaKey.anonymousKey(), schemaNode)); 

    Processor<ValueHolder<SchemaTree>, ValueHolder<SchemaTree>> processor = 
    validator.getProcessor(); 
    report = ProcessingResult.uncheckedResult(processor, report, holder).getReport(); 

    if (!report.isSuccess()) { 
    IllegalArgumentException ex = new IllegalArgumentException(); 

    for (ProcessingMessage processingMessage : report) { 
     ex.addSuppressed(processingMessage.asException()); 
    } 

    throw ex; 
    } 
} 
2

ため、かなり標準的なものですまた、実装がこの制限を変更する理由もありません。

メタスキーマをダウンロードして"additionalProperties": falseに変更し、バリデーターを使用してこの変更されたメタスキーマをロードし、独自のスキーマで検証してください。

draft4メタスキーマはここにある:http://json-schema.org/draft-04/schema

+0

良い点、ありがとうございます。しかし私は実際に私に合った、私の問題に対する別のアプローチを見つけました。とにかくありがとう。 – LIvanov

関連する問題