Skip to content

Instantly share code, notes, and snippets.

@stantonk
Created October 7, 2015 16:43
Show Gist options
  • Save stantonk/fe6d8a3560d2a2e18f35 to your computer and use it in GitHub Desktop.
Save stantonk/fe6d8a3560d2a2e18f35 to your computer and use it in GitHub Desktop.
Using Jackson + Hibernate Validation to load YAML or Java config files and validate configuration key/val pairs are valid.
package default;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import org.hibernate.validator.constraints.NotEmpty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.util.List;
import java.util.Set;
public class ConfigLoader {
private static final Logger logger = LoggerFactory.getLogger(ConfigLoader.class);
public static void main(String[] args) throws IOException {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
List<String> testYamls = Lists.newArrayList(
"name: Kevin\nage: 34\n",
"age: 34\n",
"{\"name\": \"Kevin\", \"age\": 34}"
);
testYamls.forEach(yaml -> {
System.out.println("raw YAML:\n" + yaml);
User user = null;
try {
user = objectMapper.readValue(yaml, User.class);
} catch (IOException e) {
logger.error("Exception caught:", e);
}
if (user != null) {
final Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.size() > 0) {
System.out.println("YAML config contains errors:");
violations.forEach(u -> System.out.println(" \"" + u.getPropertyPath().toString() + "\"" + " " + u.getMessage()));
} else {
System.out.println("YAML successfully decoded: " + user);
}
System.out.println("****************************************");
}
});
}
public static class User {
@NotEmpty
@NotNull
private String name;
@NotEmpty
@NotNull
private String age;
public User() {
}
@JsonProperty
public String getAge() {
return age;
}
@JsonProperty
public void setAge(String age) {
this.age = age;
}
@JsonProperty
public String getName() {
return name;
}
@JsonProperty
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("age", age)
.add("name", name)
.toString();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment