> For the complete documentation index, see [llms.txt](https://jack80342.gitbook.io/spring-boot/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jack80342.gitbook.io/spring-boot/iv.-spring-boot-features/24.-externalized-configuration/24.7.-type-safe-configuration-properties/24.7.4.-configurationproperties-validation.md).

# 24.7.4. @ConfigurationProperties校验

Spring Boot会尝试校验`@ConfigurationProperties`类，只要它们标注了Spring的`@Validated`。你可以在你的配置类中直接使用JSR-303 `javax.validation`约束标注。确保在你的类路径中存在适用的JSR-303实现，再添加约束标注在你的域中：

```java
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {

    @NotNull
    private InetAddress remoteAddress;

    // ... getters and setters

}
```

**注** 你也可以通过标注`@Bean`方法触发验证，用`@Validated`创建配置属性。

尽管在绑定后，内嵌属性也会被验证，但还是把相关的域标注上`@Valid`不失为一种良好的实践。这确保了即使没有找到内嵌属性，验证还是会被触发。下面的例子建立在之前的`AcmeProperties`示例之上： 为了校验内嵌属性的值，你需要使用`@Valid`注解关联的字段以触发它的校验，例如，建立在上面的FooProperties示例之上：

```java
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {

    @NotNull
    private InetAddress remoteAddress;

    @Valid
    private final Security security = new Security(); 

    // ... getters and setters

    public static class Security {

        @NotEmpty
        public String username;

        // ... getters and setters

    }

}
```

你也可以通过创建一个叫做`configurationPropertiesValidator`的bean来添加自定义的Spring `Validator`。`@Bean`方法需要声明为`static`，因为配置属性校验器在应用程序生命周期中创建的比较早，将`@Bean`方法声明为`static`允许该bean在创建时不需要实例化`@Configuration`类，从而避免了早期实例化（early instantiation）的所有问题。相关的示例可以看[这里](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-samples/spring-boot-sample-property-validation)。

**注** `spring-boot-actuator`模块包含一个暴露所有`@ConfigurationProperties` beans的端点（endpoint），通过浏览器打开`/actuator/configprops`进行浏览，或使用等效的JMX端点，具体参考[Production ready features](https://github.com/jack80342/spring-boot/tree/25350df33f8edd68b50ff6f6e1258c9df4f67d67/V.%20Spring%20Boot%20Actuator/50.%20Endpoints.md)。
