Springboot配置文件: application.yml application.properties(自带)
yml的格式写起来稍微舒服一点
在application.properties中数据是下面的样子:
#IDEA的 properties配置文件是utf-8编码的 #配置实体类Person字段 person.lastame=张三 person.age=18 person.birth=2018/11/12 person.boss=false person.maps.k1=v1 person.maps.k2=14 person.lists=a,b,c person.dog.petname=佩奇 person.dog.petage=2
如果跑测试出错,说明在IDEA的settings中file encoding没有设置为utf-8
在bean中:
package com.example.demo11.bean; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Email; import java.util.Date; import java.util.List; import java.util.Map; /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person"; 配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能; */ @Data @NoArgsConstructor @AllArgsConstructor @ConfigurationProperties(prefix = "person") @Validated //配合ConfigurationProperties注解进行JSR303数据校验 @Component public class Person { /** * <bean class="Person"> * <property name="lastName" value="字面量/${key}从环境变量,配置文件中获取值/#{SpEL}"></property> * </bean> */ //必须为邮箱格式,该校验必须在@ConfigurationProperties与@Validated在的情况下使用 @Email private String email; // @Value("${person.lastame}") private String lastame; // @Value("#{11*2}") private Integer age; // @Value("true") private boolean boss; // @Value("${person.birth}") private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; }
@Value的方式也能对应properties中的对应的值.但其只是对应单个数据比较有效,例如写一个controller,获取姓名:
controller: (这时候的bean中不使用@ConfigurationProperties和@Validated 而使用lastname)
@Value("${person.lastame}")
private String lastame;
package com.example.demo11.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${person.lastame}") private String name; @RequestMapping("/sayHello") public String sayHello(){ return "Hello , " + name; } }
运行主程序,(非测试) 查看路径可以获取到bean中person的lastname属性值.
还挺方便.
>
|
>
简单说下SpringBoot的测试类:
package com.example.demo11; import com.example.demo11.bean.Person; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class Demo11ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { System.out.println(person); } }
SpringBoot 测试类,(单元测试)
注解
@SpringBootTest 说明这个类是一个SpringBoot的测试类,
@RunWith(SpringRunner.class) 说明是用Spring的驱动器来跑,而不是用原来的Junit
可以在测试期间很方便地类似编码一样进行自动注入等容器的功能.
如果不使用@ConfigurationProperties 也可以使用@Value注解
但@ConfigurationProperties这种支持数据名称松散绑定,而@Value必须对应
配置文件yml还是properties都能获取到值.
如果说,只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写一个javaBean来和配置文件进行映射,
我们就直接使用@ConfigurationProperties
特殊情况下可以@ConfigurationProperties和@Value结合使用.
两种数据获取的注解区别:

SpEL : Spring表达式语言 ...
自定义数据校验注解: https://www.cnblogs.com/niceyoo/p/9497235.html
自定义数据校验:
||||
自定义数据校验:

注意,使用建立class的方式,将class改为@interface
详见 https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/ 创建一个包含验证逻辑的简单应用(基于 JSP)下面的 >> 定制化的 constraint
IDValidator : (Annotation)
package com.example.demo11.validator.annotation; import com.example.demo11.validator.IDConstraintValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = {IDConstraintValidator.class}) @Target({ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface IDValidator { //提示信息 String message() default "身份证号长度需要在15或18位,并全为阿拉伯数字."; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
IDConstraintValidator:(定义一个类用来处理具体的验证逻辑)
package com.example.demo11.validator; import com.example.demo11.validator.annotation.IDValidator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class IDConstraintValidator implements ConstraintValidator<IDValidator,String> { @Override public void initialize(IDValidator constraintAnnotation) { } @Override public boolean isValid(String id, ConstraintValidatorContext constraintValidatorContext) { int length = id.length(); //验证id全为数字,长度为15位或18位.(现在估计全是18位了?) if ((id.matches("^[0-9]*$")) && (length == 15 || length == 18)){ //验证成功 return true; } //否则不予通过 return false; } }
之后在bean中加入属性:
@IDValidator
private String idnumber;
这个属性说明这是一个CN身份证号码,上面的验证逻辑也说明了这一点: (这样是不准确的,因为身份证中还可能含有字母X,x)
身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
所以经过更改后:
IDConstraintValidator:
package com.example.demo11.validator; import com.example.demo11.validator.annotation.IDValidator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class IDConstraintValidator implements ConstraintValidator<IDValidator,String> { @Override public void initialize(IDValidator constraintAnnotation) { } @Override public boolean isValid(String id, ConstraintValidatorContext constraintValidatorContext) { int length = id.length(); //直接使用身份证号码的正则表达式: //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X,x //15位或18位的正则表达式为: //^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$ //下面的是18位的身份证验证: if(id.matches("^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$")){ return true; } //否则不予通过 return false; } }
同样提示message也更改为: 注解 - IDValidator 中:
//提示信息 String message() default "非正确的身份证格式.";
||||
部分的数据校验注解:

JSR303上面的链接中还说明了使用自定义的验证注解.
下面的图表名了注解的有效性,但必须配合@ConfigurationProperties和@Validated
