I am trying to validate JSon using the json schema validator. But it returns a generic message. "Json content is not compliant with schema" . I have a HTTP POST REQUEST which sends a payload as follows:
{ "key1" : "value1", "key2" : "value2" ,"key3": "value3" }
if key1 and key2 is missing . I want it to give error messages as follows:
{{
errorCode :1001,
errorMessage : key1 is missing",
},
errorCode :1002,
errorMessage : key2 is missing"
}
}
I tried writing the errors to a file(json file containing all the warnings and messages} looks something like this:
{
"level" : "error",
"domain" : "validation",
"keyword" : "required",
"message" : "object has missing required properties ([\"key1\",\"key2\",\"key3\"])",
"required" : [ "key1", "key2", "key3"],
"missing" : [ "key1", "key2"]
}
This is just a small part of this file. I'll have to loop through the file to reach this information. Is there any other way , I can perform custom validations and return proper error messages to the user.
EDIT 1:
I have created the following RequestObj class:
public class 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 + "]";
}
It is not validating key1 as not null.
postman request :
POST /validate HTTP/1.1 Host: localhost:8081 Content-Type: application/json
{ "key2" :"gg", "key3" : "hh" }
when I implement the validator interface. I dont get access to the mule Event. How will I access the json that I need to validate in this case ?
This is how my result looks after performing custom validations on the json input. I used JSR-303 annotations for validating the data.
class Example{
@NotBlank
@Size(min = 3, max = 5)
private String key1;
@Pattern(regexp=".+@.+\\.[a-z]+") // email
private String key2;
private String key3;
}
then I wrote a custom validator and I invoked the static function validate by passing all the values:
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;
}
}
The result is the hashmap which returns all the violations.Logging it will give you the result.
POM dependencies required are:
<!-- 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>