[SpringBoot] - 配置文件的多种形式及JSR303数据校验

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
 
 
 

转载于:https://www.cnblogs.com/ukzq/p/9947870.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值