SpringBoot 表單驗證 @Valid

@Valid 驗證性註解 ,根據註釋驗證表單數據

1.新建enity 類

package com.imooc.sell.dataobject;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.imooc.sell.enums.OrderStatusEnum;
import com.imooc.sell.enums.ProductStatusEnum;
import com.imooc.sell.utils.CodeUtils;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;

/**商品
 * @Author: 阿俊哥
 * @Date: 2019/3/2 12:57
 * @Version 1.0
 */
@Entity
@Data
@DynamicUpdate
@Table(name = "product_info")
public class ProductInfo {
    @Id
    private String productId;

    /*商品名稱*/
    private String productName;

    /*商品價格*/
    private BigDecimal productPrice;

    /*商品庫存*/
    private Integer productStock;

    /*商品介紹*/
    private String productDescription;

    /*商品圖片*/
    private String productIcon;

    /*商品狀態 0 上架 1 下架*/
    private Integer productStatus=ProductStatusEnum.UP.getCode();

    private Date createTime;

    private Date updateTime;

    /*商品所在類目*/
    private Integer categoryType;

    public ProductStatusEnum getProductStatusCode()
    {
        return CodeUtils.getCode(productStatus, ProductStatusEnum.class);
    }


}

2.新建form對應的實體類對象

通常爲了代碼的可讀性,和區分實體類的功能的原則下,我們會建立一個與表單對應的實體對象,況且大多數的情況下,我們的表單對應的字段少於實體類對應的字段

package com.imooc.sell.form;

import lombok.Data;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;

/**
 * @Author: 阿俊哥
 * @Date: 2019/3/19 20:06
 * @Version 1.0
 */
@Data
public class ProductForm {

    private String productId;

    @NotEmpty(message = "名稱不能爲空")
    /*商品名稱*/
    private String productName;
    @NotEmpty(message ="價格不能爲空" )
    /*商品價格*/
    private BigDecimal productPrice;
    @Min(value = 1,message = "庫存數不能小於1")
    /*商品庫存*/
    private Integer productStock;

    /*商品介紹*/
    private String productDescription;

    /*商品圖片*/
    private String productIcon;
    /*商品所在類目*/
    private Integer categoryType;
}

關於驗證性註釋,我們一般都寫在表單對象裏面

還有以下注釋可以選擇  來自https://blog.csdn.net/hlx20080808/article/details/80494199 

@Null    限制只能爲null 
@NotNull   限制必須不爲null 
@AssertFalse  限制必須爲false 
@AssertTrue   限制必須爲true 
@DecimalMax(value)   限制必須爲一個不大於指定值的數字 
@DecimalMin(value)    限制必須爲一個不小於指定值的數字 
@Digits(integer,fraction)   限制必須爲一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction 
@Future    限制必須是一個將來的日期 
@Max(value)   限制必須爲一個不大於指定值的數字 
@Min(value)   限制必須爲一個不小於指定值的數字 
@Pattern(value)   限制必須符合指定的正則表達式 
@Size(max,min)   限制字符長度必須在min到max之間 
@Past    驗證註解的元素值(日期類型)比當前時間早 
@NotEmpty  驗證註解的元素值不爲null且不爲空(字符串長度不爲0、集合大小不爲0) 
@NotBlank   驗證註解的元素值不爲空(不爲null、去除首位空格後長度爲0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格 

@Email   驗證註解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式 
3.新建Controller 類

/**
 * @Author: 阿俊哥
 * @Date: 2019/3/17 18:19
 * @Version 1.0
 */
@Controller
@Slf4j
@RequestMapping("/seller/product")
public class SellerProductController {
    @Autowired
    ProductService productService;
    @Autowired
    CategoryService categoryService;

 @RequestMapping("/save")
    public ModelAndView save(@Valid ProductForm productForm,
                             BindingResult bindingResult,
                             Map<String,Object> map)
    {
        //判斷有沒有出錯
        if(bindingResult.hasErrors())
        {
            map.put("msg", bindingResult.getFieldError().getDefaultMessage());
            map.put("url","/sell/seller/product/index");
            return new ModelAndView("common/error", map);
        }
        //對於修改,我們要先查詢基本的值,再進行更新
        //捕獲一下異常
        try{
            ProductInfo productInfo = new ProductInfo();
            if(StringUtils.isEmpty(productForm.getProductId()))
            {
                productInfo = ProductForm2ProductInfo.convert(productForm,productInfo);
            }
            else{
                productInfo = productService.findById(productForm.getProductId());
                productInfo = ProductForm2ProductInfo.convert(productForm,productInfo);
            }

            productService.saveProduct(productInfo);
        }catch (Exception e)
        {
            map.put("msg", ResultEnum.ERROR.getMsg());
            map.put("url","/sell/seller/product/index");
            return new ModelAndView("common/error", map);
        }


        map.put("url","/sell/seller/product/list");
        return new ModelAndView("common/success", map);
    }

4.當我們在存儲的時候,我們會把form對象轉換爲entity 對象,這裏爲了邏輯功能的實現和代碼的可讀性,我們專門創建一個類,來進行form 對象和 entity 對象的轉換

package com.imooc.sell.converter;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonToken;
import com.imooc.sell.dataobject.OrderDetail;
import com.imooc.sell.dto.OrderMasterDTO;
import com.imooc.sell.enums.ResultEnum;
import com.imooc.sell.exception.ResultException;
import com.imooc.sell.form.OrderForm;
import lombok.extern.slf4j.Slf4j;
import sun.rmi.runtime.Log;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: 阿俊哥
 * @Date: 2019/3/8 20:16
 * @Version 1.0
 */
@Slf4j
public class OrderForm2OrderMasterDTO {

    public static OrderMasterDTO convert(OrderForm orderForm)
    {
        Gson gson = new Gson();

        OrderMasterDTO orderMasterDTO = new OrderMasterDTO();
        orderMasterDTO.setBuyName(orderForm.getName());
        orderMasterDTO.setBuyPhone(orderForm.getPhone());
        orderMasterDTO.setBuyAdress(orderForm.getAddress());
        orderMasterDTO.setBuyOpenid(orderForm.getOpenid());

        List<OrderDetail> orderDetailList = new ArrayList<>();
        try {
           orderDetailList =  gson.fromJson(orderForm.getItems(), new TypeToken<List<OrderDetail>>(){}.getType());
        }catch (Exception e)
        {
            log.error("【對象轉換錯誤】錯誤 String = {}",orderForm.getItems());
          
        }


        orderMasterDTO.setOrderDetailList(orderDetailList);
        return  orderMasterDTO;
    }
}

5.接下來就是頁面了,我們這裏用的freemarker 我們這裏主要有一些表單的代碼



    <#--主要內容content-->
    <div id="page-content-wrapper">
        <div class="container-fluid">
            <div class="row clearfix">
                <div class="col-md-12 column">
                    <form role="form" method="post" action="/sell/seller/product/save">
                        <div class="form-group">
                            <label >名稱</label>
                            <input type="text" class="form-control" name="productName" value="${(productInfo.getProductName())!""}" />
                        </div>
                        <div class="form-group">
                            <label >單價</label>
                            <input type="text" class="form-control" name="productPrice" value="${(productInfo.getProductPrice())!""}" />
                        </div>
                        <div class="form-group">
                            <label >庫存</label>
                            <input type="number" class="form-control" name="productStock" value="${(productInfo.getProductStock())!""}" />
                        </div>
                        <div class="form-group">
                            <label >介紹</label>
                            <input type="text" class="form-control" name="productDescription" value="${(productInfo.getProductDescription())!""}" />
                        </div>
                        <div class="form-group">
                            <label >圖片</label>
                            <img src="${(productInfo.productIcon)!""}"  width="150"   height="130" />
                            <input type="text" class="form-control" name="productIcon" value="${(productInfo.getProductIcon())!""}" />
                        </div>
                        <div class="form-group">
                            <label >類目</label>
                            <select name="categoryType" class="form-control">
                                <#list productCategorieList as productCategory>
                                    <option value="${productCategory.categoryType}"
                                        <#if productInfo?? && productCategory.categoryType == productInfo.categoryType>
                                            selected
                                        </#if>
                                    >${productCategory.getCategoryName()}</option>
                                </#list>

                            </select>
                        </div>


                        <div>
                            <input type="text" name="productId" value="${(productInfo.productId)!""}" hidden="hidden">
                        </div>
                        <button type="submit" class="btn btn-default">提交</button>
                    </form>
                </div>
            </div>
        </div>

這樣當我們表單提價的時候就會自動的進行驗證 轉換,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章