Я пытаюсь проверить JSon, используя валидатор схемы json. Но он возвращает общее сообщение. msgstr " Json не соответствует схеме ". У меня есть HTTP POST REQUEST, который отправляет полезную нагрузку следующим образом:

{"key1": "value1", "key2": "value2", "key3": "value3"}

Если ключ1 и ключ2 отсутствуют. Я хочу, чтобы он выдавал сообщения об ошибках следующим образом:

{{
  errorCode :1001,
  errorMessage : key1 is missing",
},
  errorCode :1002,
  errorMessage : key2 is missing"
}
}

Я попытался записать ошибки в файл (файл json, содержащий все предупреждения и сообщения) выглядит примерно так:

{
  "level" : "error",
  "domain" : "validation",
  "keyword" : "required",
  "message" : "object has missing required properties ([\"key1\",\"key2\",\"key3\"])",
  "required" : [ "key1", "key2", "key3"],
  "missing" : [ "key1", "key2"]
}

Это только небольшая часть этого файла. Я должен пройтись по файлу, чтобы получить эту информацию. Есть ли другой способ, я могу выполнить пользовательские проверки и вернуть правильные сообщения об ошибках пользователю.

ИЗМЕНИТЬ 1:

Я создал следующий класс RequestObj:

Открытый класс RequestObj {

@Valid
@NotBlank
@NotNull
private String key1;

@Valid
@NotBlank
private String key2;

@Valid
@NotBlank
private String key3;

@Override
public String toString() {
    return "RequestObj [key1=" + key1 + ", key2=" + key2 + ", key3=" + key3 + "]";
}

enter image description here

Это не проверяет key1 как не нуль.

Запрос почтальона:

POST / validate HTTP / 1.1 Хост: localhost: 8081 Тип контента: приложение / json

{"key2": "gg", "key3": "hh"}

РЕДАКТИРОВАТЬ 2: введите описание изображения здесь

Когда я реализую интерфейс валидатора. Я не могу получить доступ к событию мул. Как я получу доступ к json, который мне нужно проверить в этом случае?

2
HMT 20 Дек 2019 в 07:33

2 ответа

Лучший ответ

enter image description here

Вот как выглядит мой результат после выполнения пользовательских проверок ввода json. Я использовал аннотации JSR-303 для проверки данных.

class Example{ 
   @NotBlank
        @Size(min = 3, max = 5)
        private String key1;

        @Pattern(regexp=".+@.+\\.[a-z]+") // email
        private String key2;

        private String key3;
}

Затем я написал собственный валидатор и вызвал статическую функцию проверки, передав все значения:

public class ValidationServiceImpl {

    public static HashMap<String,String> validate(String key1 , String key2 , String key3)  {
        HashMap<String,String> result = new HashMap();
        Example req = new Example(key1 , key2, key3);
    Validator validator;
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    validator = validatorFactory.getValidator();
    Set<ConstraintViolation<Example>> violations = validator.validate(req);
    if(!CollectionUtils.isEmpty(violations)) {
        for (ConstraintViolation<Example> violation : violations) 
        {
            String propertyPath = violation.getPropertyPath().toString();
            String message = violation.getMessage();
            result.put(propertyPath, message);
        }
    }
    return result;
    }

}

Результатом является хэш-карта, которая возвращает все нарушения. Регистрация даст вам результат.

Требуются зависимости POM:

<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.0.Final</version>
</dependency>
   <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.1.0.Final</version>
</dependency>


    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish/javax.el -->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.0</version>
</dependency>
3
HMT 31 Дек 2019 в 07:03

Если встроенный валидатор JSON не предоставляет необходимую вам валидацию или отчеты об ошибках, тогда вам нужно реализовать свой собственный валидатор в Java. См. Документы о том, как реализовать пользовательский валидатор, расширяя интерфейс Validator, и в своем классе реализации вы можете использовать любую библиотеку Java для проверки JSON, например, Джексон или GSON. Затем вы можете настроить обработка ошибок.

2
aled 20 Дек 2019 в 14:46