SpringBootyaml语法与JRS303校验超详细讲解

2022-11-13 18:11:22 语法 校验 讲解

基本要点

1、properties和yaml文件

properties文件中的配置只支持键值对的形式,例如

server.port = 8081

yaml文件可以支持键值对、对象、数组(对空格的要求极其严格)

name: decade
#对象
student:
    name: decade
    age: 21

#对象的行内写法
student: {name: decade,age: 21} 
#数组
pets:
    - cat
    - dog
    - pig
pets: [cat,dog,pig]

2、给属性赋值的几种方式

1)如果使用*.properties作为配置文件,给属性赋值可以使用@Value

关键注解:@PropertySource+@Value

@PropertySource注解的value需要填关联配置文件的路径

注意:如果配置文件是application.properties,下面@ConfigurationProperties+@Component的注解也可以获取配置文件中的配置项

首先我们需要将idea中配置文件的编码格式改为utf8

然后我们定义一个实体类,使用EL表达式引用配置文件中的配置项

package com.decade.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@PropertySource("classpath:application.properties")
public class Dog {
    @Value("${dog.name}")
    private String name;
}

2)使用yaml文件给属性赋值

@Component:将类注册成容器中的组件(使用configurationProperties的前提)

@ConfigurationProperties:注解可以将类中的属性和配置文件中的进行绑定

该注解的属性prefix表示要在yaml文件中寻找以改属性值为开头的配置项进行绑定,例如@ConfigurationProperties(prefix = “people”)

松散绑定:yaml文件中的属性可以是下划线连接,实体类中可以是驼峰命名

例如yaml中是last_name,实体类中是lastName

package com.decade.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "people")
public class People {
    private String name;
    private Integer age;
    private Boolean isHappy;
    private Date birth;
    private Map<String, Object> maps;
    private List<Object> list;
    private Dog dog;
}

如果添加注解爆红,那么需要在pom文件中添加一下下面这个依赖

这个依赖可以将我们的实体类与yaml文件关联起来,这样我们在yaml文件中进行配置配置项时,可以自动联想实体类中的属性

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

下面是2种方式的配置文件

最后我们写一个测试类测试一下两种方式是否导入成功

package com.decade;
import com.decade.pojo.Dog;
import com.decade.pojo.People;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootStudyApplicationTests {
    @Autowired
    private People people;
    @Autowired
    private Dog dog;
    @Test
    void contextLoads() {
        System.out.println(people);
        System.out.println("========================");
        System.out.println(dog);
    }
}

运行结果如下,验证通过

3、JRS303校验

在日常开发中,我们经常会遇到需要对数据进行校验的场景,例如非空校验和格式校验

这个时候,JRS303校验就能派上用场,如果数据不满足标准,则会统一抛出异常,方便异常中心统一处理

首先,我们需要导入相关依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

接着,我们在需要校验的属性所属的类上使用@Validated注解

在校验的字段上添加相关注解,常用注解如下

@Null 验证对象是否为null 
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串 
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. 
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查 
@AssertTrue 验证 Boolean 对象是否为 true 
@AssertFalse 验证 Boolean 对象是否为 false
长度检查 
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 
@Length(min=, max=) Validates that the annotated string is between min and max included.
日期检查 
@Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期 
@Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期 
@Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。
数值检查 
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null 
@Min 验证 Number 和 String 对象是否大等于指定的值 
@Max 验证 Number 和 String 对象是否小等于指定的值 
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 
@Digits 验证 Number 和 String 的构成是否合法 
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 
@Range(min=, max=) 被指定的元素必须在合适的范围内 
@Range(min=10000,max=50000,message=”range.bean.wage”) 
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证) 
@CreditCardNumber信用卡验证 
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。 
@ScriptAssert(lang= ,script=, alias=) 
@URL(protocol=,host=, port=,regexp=, flags=)

我们限制People的name属性不可为空并且在message属性中自定义错误信息

然后在配置文件中将该值设置为空,运行测试类提示如下

注意:

JRS303只可用于@ConfigurationProperties修饰的类

对于@PropertySource+@Value修饰的属性不生效

如图所示,我们把dog.name置空,运行测试代码,也不会出现报错

到此这篇关于SpringBoot yaml语法与JRS303校验超详细讲解的文章就介绍到这了,更多相关SpringBoot yaml语法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章