[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
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM