Spring boot配置绑定和配置属性校验的方式详解

以下是关于“Spring boot配置绑定和配置属性校验的方式详解”的完整攻略,包含两个示例说明。

Spring boot配置绑定和配置属性校验的方式详解

背景

在开发 Spring Boot 应用时,我们经常需要配置一些参数,比如数据库连接信息、服务端口等等。而在应用部署时,这些参数也需要灵活地根据不同的环境进行配置,比如开发环境、测试环境、生产环境等等。因此,Spring Boot 提供了一组配置绑定和配置属性校验的方式,来帮助我们方便地处理这些问题。

配置绑定

Spring Boot 提供了多种方式来实现配置绑定,这里介绍其中比较常用的两种方式。

1. 使用 @ConfigurationProperties 注解

@ConfigurationProperties 注解可以将配置文件中的属性与 Java 类的属性进行绑定,使用起来比较简单。具体步骤如下:

  1. 定义一个配置类,使用 @ConfigurationProperties 注解指定要绑定的属性前缀。
@ConfigurationProperties(prefix = "my")
public class MyConfig {
    private String name;
    private String description;
    // ... 其他属性的定义及其 getter/setter 方法
}
  1. 在配置文件 application.yml 或 application.properties 中设置属性值。
my:
  name: My Application
  description: This is a demo application.
  1. 在 Spring Boot 应用中注入该配置类即可。
@RestController
public class MyController {
    private MyConfig myConfig;

    public MyController(MyConfig myConfig) {
        this.myConfig = myConfig;
    }

    @GetMapping("/my-config")
    public MyConfig getConfig() {
        return myConfig;
    }
}

这样,我们就可以在 /my-config 接口中获取到应用配置信息了。

2. 使用 @Value 注解

@Value 注解同样可以将配置文件中的属性与 Java 类的属性进行绑定,但相对来说使用起来稍微麻烦一些。具体步骤如下:

  1. 在 Java 类中使用 @Value 注解,指定要绑定的属性及其默认值。
public class MyConfig {
    @Value("${my.name:My Application}")
    private String name;

    @Value("${my.description:This is a demo application.}")
    private String description;

    // ... 其他属性的定义及其 getter/setter 方法
}
  1. 在配置文件中设置属性值,如果没有设置,则使用默认值。
my:
  description: This is a demo application.
  1. 在 Spring Boot 应用中注入该配置类即可。
@RestController
public class MyController {
    private MyConfig myConfig;

    public MyController(MyConfig myConfig) {
        this.myConfig = myConfig;
    }

    @GetMapping("/my-config")
    public MyConfig getConfig() {
        return myConfig;
    }
}

属性校验

在应用开发过程中,我们经常需要对属性进行校验,以保证应用逻辑的正确性和安全性。Spring Boot 可以通过 Hibernate Validator 库来实现属性校验。

1. 使用注解进行校验

我们可以在实体类的属性上,使用注解来指定该属性的校验规则,Spring Boot 将会自动对该属性进行校验。具体步骤如下:

  1. 引入 Hibernate Validator 依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. 定义一个实体类,并使用注解指定属性的校验规则。
public class User {
    @NotBlank(message = "用户名不能为空")
    private String username;

    @Size(min = 6, max = 32, message = "密码长度必须为 6 ~ 32 个字符")
    private String password;

    @Email(message = "邮箱格式不正确")
    private String email;

    // ... 其他属性的定义及其 getter/setter 方法
}
  1. 在接口中使用 @Validated 注解,并添加 BindingResult 参数,Spring Boot 将会自动对实体类进行校验,并将错误信息保存在 BindingResult 中。
@RestController
@RequestMapping("/users")
@Validated
public class UserController {
    @PostMapping
    public ResponseEntity<?> createUser(@RequestBody @Valid User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
        }
        // ... 创建用户逻辑
    }
}

2. 自定义校验器

除了使用注解进行校验之外,我们还可以自定义校验器,来实现更加复杂的校验逻辑。具体步骤如下:

  1. 定义一个校验器。校验器需要实现 ConstraintValidator 接口,并重写 initialize 和 isValid 两个方法。
public class MyValidator implements ConstraintValidator<MyAnnotation, String> {
    private String[] values;

    @Override
    public void initialize(MyAnnotation annotation) {
        values = annotation.value();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return Arrays.asList(values).contains(value);
    }
}
  1. 定义一个注解,并使用 @Constraint 注解指定关联的校验器。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidator.class)
public @interface MyAnnotation {
    String message() default "参数不正确";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    String[] value();
}
  1. 在实体类的属性上使用自定义注解,即可实现自定义校验器的功能。
public class MyRequest {
    @MyAnnotation(value = {"A", "B", "C"}, message = "类型必须为 A/B/C")
    private String type;

    // ... 其他属性的定义及其 getter/setter 方法
}

这样,在使用 @Validated 校验实体类时,自定义的校验器也将被自动地执行。

示例说明

这里给出两个示例说明,分别演示了如何使用 @ConfigurationProperties 进行配置绑定,以及如何自定义校验器。

示例1:使用 @ConfigurationProperties 进行配置绑定

首先,我们创建一个 MyConfig 类,在该类中定义了两个属性 name 和 description,并使用 @ConfigurationProperties 注解将其与配置文件中的属性进行了绑定。

@ConfigurationProperties(prefix = "my")
public class MyConfig {
    private String name;
    private String description;

    // ... 其他属性的定义及其 getter/setter 方法
}

然后,在配置文件 application.yml 中设置了 MyConfig 类的两个属性值。

my:
  name: My Application
  description: This is a demo application.

最后,在控制器中注入 MyConfig 类,并将其作为接口返回值,即可实现配置绑定的功能。

@RestController
public class MyController {
    private MyConfig myConfig;

    public MyController(MyConfig myConfig) {
        this.myConfig = myConfig;
    }

    @GetMapping("/my-config")
    public MyConfig getConfig() {
        return myConfig;
    }
}

此时,访问 /my-config 接口,即可获取到 MyConfig 类的属性值,验证了配置绑定的功能。

示例2:自定义校验器

首先,我们定义了一个 MyRequest 类,在该类中使用了自定义注解 MyAnnotation,该注解使用 MyValidator 校验器,来校验 type 属性的值是否在指定范围内。

public class MyRequest {
    @MyAnnotation(value = {"A", "B", "C"}, message = "类型必须为 A/B/C")
    private String type;

    // ... 其他属性的定义及其 getter/setter 方法
}

然后,我们实现了 MyValidator 校验器,该校验器接收一个 String 类型的值,和一个注解对象,在初始化时,将注解对象中的合法值取出来,然后在 isValid 方法中,判断当前值是否在合法值列表内,如果存在,则说明合法,返回 true,否则说明不合法,返回 false。

public class MyValidator implements ConstraintValidator<MyAnnotation, String> {
    private String[] values;

    @Override
    public void initialize(MyAnnotation annotation) {
        values = annotation.value();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return Arrays.asList(values).contains(value);
    }
}

最后,在使用 MyRequest 类进行校验时,就会自动地执行 MyValidator 校验器了,示例如下。

@RestController
@RequestMapping("/my")
@Validated
public class MyController {
    @PostMapping("/validate")
    public ResponseEntity<?> validateRequest(@RequestBody @Valid MyRequest request, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
        }
        return ResponseEntity.ok().build();
    }
}

启动应用之后,可以使用 Postman 或 curl 等命令行工具,向服务器发送如下请求。

{
  "type": "X"
}

此时,服务器将会返回 400 错误,响应体中包含了错误提示信息。

[
    {
        "codes": [
            "MyRequest.type",
            "type",
            "java.lang.String",
            "myrequest",
            "myRequest.type",
            "myRequest",
            "type"
        ],
        "arguments": [
            {
                "codes": [
                    "A",
                    "B",
                    "C"
                ],
                "arguments": null,
                "defaultMessage": null,
                "code": "A"
            }
        ],
        "defaultMessage": "参数不正确",
        "objectName": "myRequest",
        "field": "type",
        "rejectedValue": "X",
        "bindingFailure": false,
        "code": "myAnnotation"
    }
]

当 type 的值为 A、B、C 中的一个时,请求将会成功通过校验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot配置绑定和配置属性校验的方式详解 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Spark SQL常见4种数据源详解

    Spark SQL常见4种数据源详解 Spark SQL是一个强大的分布式数据处理引擎,可以对多种数据源进行处理。本文将重点讲解Spark SQL常见的4种数据源,包括Hive、JSON、Parquet和JDBC,并附带示例说明。 1. Hive Hive是Hadoop的数据仓库,Spark可以使用Hive的数据进行处理。为了使用Hive,请按照以下步骤: …

    Java 2023年6月16日
    00
  • Java反射机制实例代码分享

    Java反射机制实例代码分享攻略 简介 Java反射机制是指在运行时,对于任意一个类,都能够知道这个类的所有属性和方法,对于这些属性或方法可以进行操作;这种动态获取的能力称之为反射机制。 Java反射机制可以让我们在运行时动态地创建对象、访问对象属性、调用对象方法或获取类信息,甚至可以操作私有属性和方法。反射机制的使用非常方便灵活,但也增加了代码的复杂程度,…

    Java 2023年5月23日
    00
  • java模拟多线程http请求代码分享

    下面是详细的“java模拟多线程http请求代码分享”的攻略: 1. 如何使用Java模拟http请求 Java模拟http请求的主要方式是通过Java的第三方库Apache HttpClient进行实现。下面是几个常用的示例:1. 发送POST请求: CloseableHttpClient httpClient = HttpClients.createDe…

    Java 2023年5月18日
    00
  • struts2静态资源映射代码示例

    下面是关于“struts2静态资源映射代码示例”的完整攻略。 什么是struts2静态资源映射? struts2有一个默认的静态资源映射器,会将静态资源(例如图片、CSS、JavaScript文件等)映射到web应用的根目录下,从而可以在浏览器中通过相对路径来访问。 但是,有时候我们需要将这些静态资源放到web应用的其他目录中,或者更改其访问路径,这时就需要…

    Java 2023年5月20日
    00
  • 在IDEA的maven项目中连接并使用MySQL8.0的方法教程

    以下是在IDEA的maven项目中连接并使用MySQL8.0的方法教程的完整攻略: 步骤一:安装并配置MySQL 确认已安装MySQL 8.0或以上版本,并启动MySQL服务。 使用命令行或可视化工具如Navicat等创建一个数据库,例如“testdb”。 创建一个数据库用户,并授予该用户对“testdb”数据库的全部权限。 步骤二:添加Maven依赖 按照…

    Java 2023年6月16日
    00
  • 在 Linux 上安装Apache+ApacheJServ+JSP

    安装Apache和Apache JServ: 首先在终端中运行以下命令更新软件包列表: sudo apt-get update 接着,运行以下命令安装Apache和Apache JServ: sudo apt-get install apache apache-jserv 安装完成后,Apache服务会自动启动。可以在浏览器中输入localhost,来查看A…

    Java 2023年6月15日
    00
  • JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解

    JAVA开发常用类库攻略 本文将介绍JAVA开发中常用的类库UUID、Optional、ThreadLocal、TimerTask、Base64的用法和实例。希望能对大家在实际开发中遇到的问题有所帮助。 UUID UUID全称为Universally Unique Identifier,在Java中为java.util.UUID类,主要用于生成唯一标识符。 …

    Java 2023年5月18日
    00
  • 关于Java中properties文件编码问题

    关于Java中properties文件编码问题,一般可以从以下几个方面入手: properties文件编码格式 Java读取properties文件时的编码问题 properties文件中包含非ASCII字符的处理 1. properties文件编码格式 properties文件是一种很简单的配置文件,其实际上是一个基于key-value对的文本文件。pro…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部