Created
October 7, 2015 16:43
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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