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>

这样当我们表单提价的时候就会自动的进行验证 转换,

发布了41 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37992974/article/details/88943575
今日推荐