anchor.diff:  
   In order to validate values of nested properties, you must annotate the associated field
   as `@Valid` to trigger its validation. For example, building upon the above
  -`ConnectionProperties` example:
  +`FooProperties` example:
   
   [source,java,indent=0]
   ----
   	@ConfigurationProperties(prefix="connection")
  -	public class ConnectionProperties {
  +	public class FooProperties {
   
   		@NotNull
  +		private InetAddress remoteAddress;
  +
   		@Valid
  -		private RemoteAddress remoteAddress;
  +		private final Security security = new Security();
   
   		// ... getters and setters
   
  -		public static class RemoteAddress {
  +		public static class Security {
   
   			@NotEmpty
  -			public String hostname;
  +			public String username;
   
   			// ... getters and setters
   
  
positive.code: [[boot-features-external-config-typesafe-configuration-properties]]
  === Type-safe Configuration Properties
  Using the `@Value("${property}")` annotation to inject configuration properties can
  sometimes be cumbersome, especially if you are working with multiple properties or
  your data is hierarchical in nature. Spring Boot provides an alternative method
  of working with properties that allows strongly typed beans to govern and validate
  the configuration of your application. For example:
  
  [source,java,indent=0]
  ----
  	@ConfigurationProperties(prefix="connection")
  	public class ConnectionProperties {
  
  		private String username;
  
  		private InetAddress remoteAddress;
  
  		// ... getters and setters
  
  	}
  ----
  
  NOTE: The getters and setters are advisable, since binding is via standard Java Beans
  property descriptors, just like in Spring MVC. They are mandatory for immutable types or
  those that are directly coercible from `String`. As long as they are initialized, maps,
  collections, and arrays need a getter but not necessarily a setter since they can be
  mutated by the binder. If there is a setter, Maps, collections, and arrays can be created.
  Maps and collections can be expanded with only a getter, whereas arrays require a setter.
  Nested POJO properties can also be created (so a setter is not mandatory) if they have a
  default constructor, or a constructor accepting a single value that can be coerced from
  String. Some people use Project Lombok to add getters and setters automatically.
  
  TIP: See also the <<boot-features-external-config-vs-value,differences between `@Value`
  and `@ConfigurationProperties`>>.
  
negative.code: 
  [source,java,indent=0]
  ----
  	@ConfigurationProperties(prefix="foo")
  	public class FooProperties {
  
  		@NotNull
  		private InetAddress remoteAddress;
  