Spring Boot之驗證模組應用總結2

bladestone發表於2019-03-26

DAO的驗證模組

對於Entity實體來說,同樣可以基於validation註解來定義相關的驗證邏輯。本節將通過相關示例來介紹如何使用這些註解簡化日常的開發工作。

Entity定義

在Maven檔案中引入:

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

定義測試Entity:


@Entity
@Data
public class ProductEntity {
    @Id
    @GeneratedValue
    private Long id;
    //限購:1~5
    @Min(value = 1, message = "min Value is above zero")
    @Max(value = 10, message = "最大值不超過10")
    private int count;

    @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$", message = "不符合IP規則")
    private String ipAddr;

    @Email(message = "email format error")
    @NotBlank
    private String email;

    @NotBlank(message = "name 不能為空")
    @Length(min=5, max = 10, message = "name長度在5到10個字元之間")
    private String name;
}

在這個entity中,使用了不同註解針對這些欄位進行驗證,並自定義了相關的提示資訊。
在Spring Boot的DAO中,預設驗證是開啟的。如果要關閉驗證邏輯,則需要將Spring Boot開關在配置檔案中關閉,具體設定如下:

spring.jpa.properties.javax.persistence.validation.mode=none

單元測試

為了進行單元測試,首先需要將相關依賴加到專案中:

    <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
      </dependency>

此為轉為進行資料測試的H2測試資料庫。
測試程式碼:

@RunWith(SpringRunner.class)
@DataJpaTest
public class ProductEntityValidTest {
    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private ProductRepository productRepository;

    @Test(expected=ConstraintViolationException.class)
    public void testEntityInValidation() {
        ProductEntity product = badRequest();

        this.productRepository.save(product);

        //進行重新整理之後,方可觸發實際的validation邏輯檢查
        this.productRepository.flush();
    }

    @Test
    public void testEntityValidation() {
        ProductEntity product = goodProduct();

        this.productRepository.save(product);

        //進行重新整理之後,方可觸發實際的validation邏輯檢查
        this.productRepository.flush();
    }

    private ProductEntity badRequest() {
        ProductEntity product = new ProductEntity();
        product.setCount(12);
        product.setEmail("add");
        product.setIpAddr("12.33.");
        product.setName("abc");

        return product;
    }

    private ProductEntity goodProduct() {
        ProductEntity product = new ProductEntity();
        product.setName("zhangds");
        product.setCount(9);
        product.setEmail("abc@12.cn");
        product.setIpAddr("3.3.4.4");

        return product;
    }
}

即可進行正常的功能驗證操作。

總結

在Entity這層進行驗證,非常的簡單,不需要進行大量冗餘的邏輯程式碼驗證,可以節省大量的開發工作量。

相關文章