Как использовать $ref для установки условий для объектов подсхем с использованием черновика схемы json 2020-12 в проектеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как использовать $ref для установки условий для объектов подсхем с использованием черновика схемы json 2020-12 в проекте

Сообщение Anonymous »

Я пытаюсь выполнить проверку схемы json при весенней загрузке 3.3.3, в папке ресурсов я поместил схемы main.json, sub1.json и sub2.json. Я использую $ref для ссылки на другие объекты схемы из основной схемы и хочу установить условие поля в sub2 на основе значения свойства из sub1, но при проверке всегда отсутствует обязательное поле, даже если значение отличается. В конце добавлен ожидаемый и полученный результат с теми же результатами.
Зависимость, используемая для проверки схемы:

Код: Выделить всё

com.networknt
json-schema-validator
1.4.0

Bean для загрузки схем:

Код: Выделить всё

@Bean
public JsonSchema jsonSchema() {
return JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012)
.getSchema(getClass().getClassLoader().getResourceAsStream(“/main.json”));
}
Метод контроллера:

Код: Выделить всё

@Autowired
private JsonSchema jsonSchema;

@Autowired
private ObjectMapper objectMapper;

@PostMapping("/validate")
public void validate(@RequestBody RequestDto request) {
JsonNode jsonNode = objectMapper.valueToTree(request);
Set  validationMessages = jsonSchema.validate(jsonNode);

if (!validationMessages.isEmpty()) {
throw new JsonSchemaValidationException(validationMessages);
}
log.info("Validation Passed");
}
main.json:

Код: Выделить всё

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "ResponsePayload",
"description": "Payload object response",
"type": "object",
"properties": {
"objectA": {
"$ref": "classpath:/sub1.json"
},
"objectB": {
"$ref": "classpath:/sub2.json"
},
"objectC": {
"$ref": "classpath:/sub3.json"
}
},
"required": [
"objectA",
"objectB"
]
}
sub1.json:

Код: Выделить всё

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Sub1Payload",
"description": "Sub payload 1",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"number": {
"type": "integer"
},
"type-emp-land": {
"type": "object",
"properties": {
"location": {
"type": "string"
},
"area": {
"type": "string"
}
}
}
},
"required": [
"name",
"number",
"type-emp-land"
]
}
sub2.json:

Код: Выделить всё

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Sub2Payload",
"description": "Sub payload 2",
"type": "object",
"properties": {
"location": {
"type": "string"
},
"area": {
"type": "string"
},
"radius": {
"type": "object",
"properties": {
"cm": {
"type": "integer"
},
"km": {
"type": "integer"
}
}
},
"type-emp-land-location": {
"$ref": "classpath:/sub1.json#/properties/type-emp-land/properties/location"
}
},
"required": [
"location",
"area"
],
"allOf": [
{
"if": {
"properties": {
"type-emp-land-location": {
"const": "InsideNothingHall"
}
}
},
"then": {
"required": [
"radius"
]
}
}
]
}
Ввод 1:

Код: Выделить всё

{
"objectA": {
"name": "Wired",
"number": 1234,
"type-emp-land": {
"location": "InsideNothingHall",
"area": "Inside square"
}
},
"objectB": {
"location": "Mid",
"area": "50 cm"
}
}
Ожидается:

Код: Выделить всё

JsonSchemaValidationException with required field 'radius' missing message.
Выход:

Код: Выделить всё

 JsonSchemaValidationException with required field 'radius' missing message
Ввод 2:

Код: Выделить всё

{
"objectA": {
"name":  "Wired",
"number": 1234,
"type-emp-land": {
"location": "OutTown",
"area": "Inside square"
}
},
"objectB": {
"location": "Mid",
"area": "50 cm"
}
}
Ожидается:

Код: Выделить всё

Validation Passed - log
.
Вывод:

Код: Выделить всё

JsonSchemaValidationException with required field 'radius' missing message
В обоих случаях я получаю одно и то же исключение, но в случае input2 никакого исключения возникнуть не должно.
Что мне здесь не хватает?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -schema-dr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»