3.1.补充:SpringBoot属性赋值,JSR303校验,多环境配置以及配置文件位置

一.YMAL的占位符,松散绑定,实体类装载配置文件信息用于属性赋值

  • 占位符: ${random.int}
  • 松散绑定:Dog.java中的属性名为dogName,YMAL中对应的为dog-name
  • 实体类装载配置文件信息: @ConfigurationProperties(prefix = "dog") 会将配置文件中的dog-name和age赋值给实体类的dogName和age
person:
  name: qinjiang
  age: ${random.int}  #使用占位符设置值
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - girl
    - music
  dog:
    dog-name: 旺财
    age: ${random.int}

dog:
  dog-name: 阿黄    #名字与属性松散绑定
  age: 5
@Component
@ConfigurationProperties(prefix = "dog")
public class Dog {
    private String dogName;
    private Integer age;

    public Dog() {
    }

    public Dog(String dogName, Integer age) {
        this.dogName = dogName;
        this.age = age;
    }

    public String getDogName() {
        return dogName;
    }

    public void setDogName(String dogName) {
        this.dogName = dogName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "dogName=‘" + dogName + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}

二.JSR 303 基本的校验规则

空检查

  1. @Null 验证对象是否为null
  2. @NotNull 验证对象是否不为null, 无法查检长度为0的字符串
  3. @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
  4. @NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

  1. @AssertTrue 验证 Boolean 对象是否为 true
  2. @AssertFalse 验证 Boolean 对象是否为 false

长度检查

  1. @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
  2. @Length(min=, max=) Validates that the annotated string is between min and max included.

日期检查

  1. @Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
  2. @Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
  3. @Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。

数值检查 
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null

  1. @Min 验证 Number 和 String 对象是否大等于指定的值
  2. @Max 验证 Number 和 String 对象是否小等于指定的值
  3. @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
  4. @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
  5. @Digits 验证 Number 和 String 的构成是否合法
  6. @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
  7. @Range(min=, max=) 被指定的元素必须在合适的范围内
  8. @Range(min=10000,max=50000,message=”range.bean.wage”)
  9. @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
  10. @CreditCardNumber信用卡验证
  11. @Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
  12. @ScriptAssert(lang= ,script=, alias=)
  13. @URL(protocol=,host=, port=,regexp=, flags=)

代码展示:

  1. @Validated用于数据校验
  2. @Email设置属性格式必须为email格式
 1 @Component
 2 @ConfigurationProperties(prefix = "person")
 3 @Validated
 4 public class Person {
 5
 6     @Email()
 7     private String name;
 8     private Integer age;
 9     private Boolean happy;
10     private Date birth;
11     private Map<String,Object> maps;
12     private List<Object> lists;
13     private Dog dog;
14
15     public Person() {
16     }
17
18     public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> maps, List<Object> lists, Dog dog) {
19         this.name = name;
20         this.age = age;
21         this.happy = happy;
22         this.birth = birth;
23         this.maps = maps;
24         this.lists = lists;
25         this.dog = dog;
26     }
27
28     public String getName() {
29         return name;
30     }
31
32     public void setName(String name) {
33         this.name = name;
34     }
35
36     public Integer getAge() {
37         return age;
38     }
39
40     public void setAge(Integer age) {
41         this.age = age;
42     }
43
44     public Boolean getHappy() {
45         return happy;
46     }
47
48     public void setHappy(Boolean happy) {
49         this.happy = happy;
50     }
51
52     public Date getBirth() {
53         return birth;
54     }
55
56     public void setBirth(Date birth) {
57         this.birth = birth;
58     }
59
60     public Map<String, Object> getMaps() {
61         return maps;
62     }
63
64     public void setMaps(Map<String, Object> maps) {
65         this.maps = maps;
66     }
67
68     public List<Object> getLists() {
69         return lists;
70     }
71
72     public void setLists(List<Object> lists) {
73         this.lists = lists;
74     }
75
76     public Dog getDog() {
77         return dog;
78     }
79
80     public void setDog(Dog dog) {
81         this.dog = dog;
82     }
83
84     @Override
85     public String toString() {
86         return "Person{" +
87                 "name=‘" + name + ‘\‘‘ +
88                 ", age=" + age +
89                 ", happy=" + happy +
90                 ", birth=" + birth +
91                 ", maps=" + maps +
92                 ", lists=" + lists +
93                 ", dog=" + dog +
94                 ‘}‘;
95     }
96 }

源码位置:

三.多环境配置以及配置文件位置

1.配置的位置(4个位置)

  1. file:./config/  ,项目目录下建立一个config文件夹,config文件夹下建立application.yaml
  2. file:./  ,项目目录下直接建立一个application.yaml
  3. classpath:/config/    ,resources下建立一个config文件夹,config文件夹下建立application.yaml
  4. classpath:/     ,resources下直接建立一个application.yaml

2.配置优先级:上面的顺序从上到下一次降低( file:./config/ > file:./ >  classpath:/config/ > classpath:/ )

3.多个配置文件来指定配置环境

  1. application.yaml:用来指定激活哪一个配置文件(application-xxx.yaml,绑定激活xxx即可)

  2. application-test.yaml:指定服务端口号8082

  3. application-dev.yaml:指定服务端口号8081

4.YMAL简化多文件配置

一个文件就能解决,中间用三个横线隔开

5.深入理解自动装配

精髓:

1)、SpringBoot启动会加载大量的自动配置类

2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

xxxxAutoConfigurartion:自动配置类;给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

application.yaml:用于修改springboot的属性

6.查看哪些配置生效和没有生效

(1)application.yaml中配置 debug: true

(2)设置生效只需要在pom.xml中添加启动器即可

类似:spring-boot-starter-xxx

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

原文地址:https://www.cnblogs.com/zhihaospace/p/12348283.html

时间: 2024-10-17 06:55:31

3.1.补充:SpringBoot属性赋值,JSR303校验,多环境配置以及配置文件位置的相关文章

SpringBoot在启动时的多环境配置以及加载顺序

通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除了启动应用之外,还可以在命令中指定应用的参数,比如一下带参数的命令: (1)java -jar xxx.jar --server.port=8081,直接以命令的方式来设置服务的访问端口server.port属性,将端口设置为8081; (2)java -jar -Xms1024m -Xmx1024

springboot打包去除资源文件及启动时指定配置文件位置

springboot打包时,去掉资源文件,可按照如下配置 <build> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>*.properties</exclude> <exclude>*.log4j2.xml</exclude> </excludes>

SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active

趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 java -jar app.jar --spring.profiles.active=qa --server.port=8060 //生产环境 java -jar app.jar --spring.profiles.active=prod --server.port=8060 废话少说,直接上代码 app

SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active(转)

趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 java -jar app.jar --spring.profiles.active=qa --server.port=8060 //生产环境 java -jar app.jar --spring.profiles.active=prod --server.port=8060 废话少说,直接上代码 app

springboot属性类自动加载配置文件中的值

springboot属性类自动加载配置文件中的值,如Person类加载在yml中配置的name,age等属性值,可以通过如下步骤获取: 类上添加@ConfigurationProperties注解,prefix为yml中配置的属性名称,要想属性类生效得加上@Component注解 如果想要在yml中有对应类的提示,还需要添加如下依赖: yml书写如下: 如果是properties文件,则书写如下: 在yml中如果值中有特殊字符,需要转义可以用单引号包裹,默认是双引号 如果仅仅为类中的某个属性值赋

SpringBoot参数非空校验的非最优实现历程

SpringBoot参数非空校验在网上已经有很多资料了,自己最近要实现这一个功能,大概看了下觉得没什么难度,不想在过程中还是遇到了一些问题,在此记录,希望有遇到和我一样问题的人和过路大神不吝指教. 需求是做一个全局请求参数非空校验和异常拦截,spring提供的@Validated和Hibernate提供的@Valid目前不支持请求参数为基本类型的非空判断,只能是请求参数封装为对象时,判断对象属性非空,所以要自己实现一个对基本类型的非空判断. 首先说下网上原创转载最多的一个思路:实现一个指向方法的

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

自动从DataRow里取数据给属性赋值

public abstract class ModelsBase     { //自动从DataRow里取数据给属性赋值 public void RightDataFrom(DataRow row) { Type type = this.GetType(); //遍历每一个属性 foreach (PropertyInfo prop in type.GetProperties()) { //判断是否可写入 if (prop.CanWrite == false) continue; //判断Data

JavaScript对象属性赋值操作的逻辑

对象进行属性赋值操作时,其执行逻辑如下所示: 1. 当前对象中是否有该属性?有,进行赋值操作:没有,进行下一步判断. 2. 对象的原型链中是否有该属性?没有,在当前对象上创建该属性,并赋值:有,进行下一步判断. 3. 原型链中该属性是否允许操作?是,在当前对象上创建同名属性,并赋值:否,属性赋值失败. 无论是属性赋值还是新建属性,都是在当前对象上进行的,不会修改原型链!第三种情况下,新建的属性将会覆盖对象从原型链继承来的同名属性.