@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>
这样当我们表单提价的时候就会自动的进行验证 转换,