##秒杀模块业务逻辑##
由于此段内容为MVC开发,内容基本只涉及到秒杀程序业务逻辑,故仅提供源码请同学们结合视频内容以及自己的思考完成开发
这里建议使用gitbash将代码从github clone到本地而不是看本篇文章的代码,如果不方便使用github的同学可以使用码云(Gitee)clone代码
同时可以尝试使用Git作为项目管理工具来完成整个程序的开发
Gitbash详细教程
Gitbash命令大全
Github项目地址
Gitee项目地址
BaseController
public class BaseController {
public static final String CONTENT_TYPE_FORMED="application/x-www-form-urlencoded";
//定义exceptionghandler解决为被controller层吸收的exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request, Exception ex) {
//必须自己封装data对象,否则data为exception反序列化的对象
Map<String,Object> responseData = new HashMap<>();
if(ex instanceof BussinessException){
BussinessException bussinessException = (BussinessException) ex;
responseData.put("errCode",bussinessException.getErrCode());
responseData.put("errMsg",bussinessException.getErrMsg());
} else {
responseData.put("errCode", EmBusinessError.UNKNOW_ERROR.getErrCode());
responseData.put("errMsg",EmBusinessError.UNKNOW_ERROR.getErrMsg());
}
return CommonReturnType.create(responseData,"fail");
}
}
ItemController
@Controller("/item")
@RequestMapping("/item")
@CrossOrigin(origins = {"*"}, allowCredentials = "true")
public class ItemController extends BaseController {
@Autowired
ItemService itemService;
//创建商品
@RequestMapping(value = "/create", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType createItem(@RequestParam(name = "title") String title,
@RequestParam(name = "price") BigDecimal price,
@RequestParam(name = "stock") Integer stock,
@RequestParam(name = "imgUrl") String imgUrl,
@RequestParam(name = "description") String description) throws BussinessException {
// 封装service请求用来创建商品
ItemModel itemModel = new ItemModel();
itemModel.setTitle(title);
itemModel.setPrice(price);
itemModel.setStock(stock);
itemModel.setImgUrl(imgUrl);
itemModel.setDescription(description);
//
ItemModel itemModelForReturn = itemService.createItem(itemModel);
ItemVo itemVO = this.convertVOFromModel(itemModelForReturn);
return CommonReturnType.create(itemVO);
}
//商品详情页浏览
@RequestMapping(value = "/get", method = {RequestMethod.GET})
@ResponseBody
public CommonReturnType getItem(@RequestParam(name = "id")Integer id){
ItemModel itemModel = itemService.getItemById(id);
ItemVo itemVo = this.convertVOFromModel(itemModel);
return CommonReturnType.create(itemVo);
}
//商品列表页浏览
@RequestMapping(value = "/list", method = {RequestMethod.GET})
@ResponseBody
public CommonReturnType listItem(){
List<ItemModel> itemModelList = itemService.listItem();
List<ItemVo> itemVoList = itemModelList.stream().map(itemModel -> {
ItemVo itemVo = convertVOFromModel(itemModel);
return itemVo;
}).collect(Collectors.toList());
return CommonReturnType.create(itemVoList);
}
private ItemVo convertVOFromModel(ItemModel itemModel) {
if(itemModel == null) {
return null;
}
ItemVo itemVo = new ItemVo();
BeanUtils.copyProperties(itemModel,itemVo);
if(itemModel.getPromoModel() != null){
//有正在进行或即将进行的秒杀活动
itemVo.setPromoStatus(itemModel.getPromoModel().getStatus());
itemVo.setPromoId(itemModel.getPromoModel().getId());
itemVo.setStartDate(itemModel.getPromoModel().getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));
itemVo.setPromoPrice(itemModel.getPromoModel().getPromoItemPrice());
} else {
itemVo.setPromoStatus(0);
}
return itemVo;
}
}
OrderController
@Controller("/order")
@RequestMapping("/order")
@CrossOrigin(origins = {"*"}, allowCredentials = "true")
public class OrderController extends BaseController {
@Autowired
private OrderService orderService;
@Autowired
private HttpServletRequest httpServletRequest;
//封装下单请求
@RequestMapping(value = "/createorder", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType createOrder(@RequestParam(name="itemId")Integer itemId,
@RequestParam(name="promoId",required = false)Integer promoId,
@RequestParam(name="amount")Integer amount) throws BussinessException {
//获取登录信息(Boolean)
Boolean isLogin = (Boolean) this.httpServletRequest.getSession().getAttribute("IS_LOGIN");
// System.out.println(isLogin.booleanValue());
if(isLogin == null || !isLogin.booleanValue()){
throw new BussinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登陆,不能下单");
}
// Boolean isLogin = (Boolean) this.httpServletRequest.getSession().getAttribute("IS_LOGIN");
// if (isLogin == null || !isLogin.booleanValue()) {
// throw new BussinessException(EmBusinessError.USER_NOT_LOGIN, "用户还未登录,不能下单");
// }
UserModel userModel = (UserModel) this.httpServletRequest.getSession().getAttribute("LOGIN_USER");
OrderModel orderModel = orderService.createOrder(userModel.getId(),itemId,promoId,amount);
return CommonReturnType.create(null);
}
}
UserController
@RestController
@RequestMapping("/user")
@CrossOrigin(origins = {"*"}, allowCredentials = "true")
//@CrossOrigin(allowCredentials = "true",allowedHeaders = "*")
public class UserController extends BaseController {
@Autowired
private UserService userService;
//单例 内部threadLocal
@Autowired
private HttpServletRequest httpServletRequest;
//用户登陆接口
@RequestMapping(value = "/login", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType login(@RequestParam(name="telphone")String telphong,
@RequestParam(name="password")String password) throws BussinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
//参数校验
if(org.apache.commons.lang3.StringUtils.isEmpty(telphong)|| org.apache.commons.lang3.StringUtils.isEmpty(password)){
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
}
//用户登陆服务,用来校验用户登陆是否合法
UserModel userModel =userService.validateLogin(telphong,this.enCodeByMD5(password));
//将登陆凭证加入到用户登陆成功的session中
UserVo userVo = convertFromMode(userModel);
this.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);
this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userModel);
System.out.println(this.httpServletRequest.getSession().getAttribute("IS_LOGIN"));
return CommonReturnType.create(null);
}
//用户注册接口
@Transactional
@RequestMapping(value = "/register", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType register(@RequestParam(name = "telphone") String telphone,
@RequestParam(name = "otpCode") String otpCode,
@RequestParam(name = "name") String name,
@RequestParam(name = "gender") Integer gender,
@RequestParam(name = "age") Integer age,
@RequestParam(name="password")String password) throws BussinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
//验证手机号和对应otpcode相符
String inSessionOtpCode = (String) this.httpServletRequest.getSession().getAttribute(telphone);
if (!StringUtils.equals(otpCode, inSessionOtpCode)) {
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "短信验证码不符合");
}
//用户注册流程
UserModel userModel = new UserModel();
userModel.setName(name);
userModel.setGender(new Byte(String.valueOf(gender.intValue())));
userModel.setAge(age);
userModel.setTelphone(telphone);
userModel.setRegisterMode("byphone");
userModel.setEncrptPassword(this.enCodeByMD5(password));
userService.register(userModel);
return CommonReturnType.create(null);
}
public String enCodeByMD5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
// 确定计算方法
MessageDigest md5 = MessageDigest.getInstance("MD5");
BASE64Encoder base64Encoder = new BASE64Encoder();
// 加密字符串
String newStr = base64Encoder.encode(md5.digest(str.getBytes("utf-8")));
return newStr;
}
//用户获取otp短信接口
@RequestMapping(value = "/getotp", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType getOtp(@RequestParam(name = "telphone") String telphone) {
//按照一定规则生成OTP验证码
Random random = new Random();
int randomInt = random.nextInt(99999);
randomInt += 10000;
String otpCode = String.valueOf(randomInt);
//将OTP验证同对应用户的手机号关联,使用HTTP session的方式绑定(redis非常适用)
httpServletRequest.getSession().setAttribute(telphone, otpCode);
//将OTP验证码通过短信通道发送给用户,省略
System.out.println("telphone = " + telphone + "&optCode=" + otpCode);
return CommonReturnType.create(null);
}
@RequestMapping("/get")
public CommonReturnType getUser(@RequestParam(name = "id") Integer id) throws BussinessException {
//调用service服务获取对应id对象返回给前端
UserModel userModel = userService.getUserById(id);
//若获取的对应用户信息存在
if (userModel == null) {
// userModel.setEncrptPassword("123");
throw new BussinessException(EmBusinessError.USER_NOT_EXIST);
}
//将核心领域模型用户对象转换为可供UI使用的viewobject
UserVo userVo = convertFromMode(userModel);
return CommonReturnType.create(userVo);
}
private UserVo convertFromMode(UserModel userModel) {
if (userModel == null) {
return null;
}
UserVo userVo = new UserVo();
BeanUtils.copyProperties(userModel, userVo);
return userVo;
}
}
ItemServiceImpl
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ValidatorImpl validator;
@Autowired
private ItemDOMapper itemDOMapper;
@Autowired
private ItemStockDOMapper itemStockDOMapper;
@Autowired
private PromoService promoService;
private ItemDO convertItemDOFromItemModel(ItemModel itemModel){
if(itemModel == null) {
return null;
}
ItemDO itemDO = new ItemDO();
BeanUtils.copyProperties(itemModel,itemDO);
return itemDO;
}
private ItemStockDO convertItemStockDOFromItemModel(ItemModel itemModel){
if(itemModel == null) {
return null;
}
ItemStockDO itemStockDO = new ItemStockDO();
itemStockDO.setItemId(itemModel.getId());
itemStockDO.setStock(itemModel.getStock());
return itemStockDO;
}
@Override
@Transactional
public ItemModel createItem(ItemModel itemModel) throws BussinessException {
//校验入参
ValidationResult result = validator.validate(itemModel);
if(result.isHasErrors()){
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
}
//转化itemMode-》dataobject
ItemDO itemDO = this.convertItemDOFromItemModel(itemModel);
//写入数据库
itemDOMapper.insertSelective(itemDO);
itemModel.setId(itemDO.getId());
ItemStockDO itemStockDO = this.convertItemStockDOFromItemModel(itemModel);
itemStockDOMapper.insertSelective(itemStockDO);
//返回创建完成的对象,这里要返回存入数据库的对象
return this.getItemById(itemModel.getId());
}
@Override
public List<ItemModel> listItem() {
List<ItemDO> itemDOList = itemDOMapper.listItem();
List<ItemModel> itemModelList = itemDOList.stream().map(itemDO -> {
ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
ItemModel itemModel = this.convertModelFromDataObject(itemDO,itemStockDO);
return itemModel;
}).collect(Collectors.toList());
return itemModelList;
}
@Override
public ItemModel getItemById(Integer id) {
ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
if(itemDO == null) {
return null;
}
//操作获得库存数量
ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
//将dataobject转换成model
ItemModel itemModel = this.convertModelFromDataObject(itemDO,itemStockDO);
//获取商品秒杀活动信息
PromoModel promoModel = promoService.getPromoById(itemModel.getId());
if(promoModel != null && promoModel.getStatus().intValue() != 3) {
itemModel.setPromoModel(promoModel);
}
return itemModel;
}
@Override
@Transactional
public boolean decreaseStock(Integer itemId, Integer amount) {
int affectedRow = itemStockDOMapper.decreaseStock(itemId,amount);
if(affectedRow > 0){
return true;
}else {
return false;
}
}
@Override
@Transactional
public void increaseSales(Integer itemId, Integer amount) throws BussinessException {
itemDOMapper.increaseSales(itemId,amount);
}
private ItemModel convertModelFromDataObject(ItemDO itemDO,ItemStockDO itemStockDO){
ItemModel itemModel = new ItemModel();
BeanUtils.copyProperties(itemDO,itemModel);
itemModel.setStock(itemStockDO.getStock());
return itemModel;
}
}
OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private ItemService itemService;
@Autowired
private UserService userService;
@Autowired
private OrderDOMapper orderDOMapper;
@Autowired
private SequenceDOMapper sequenceDOMapper;
@Override
@Transactional
public OrderModel createOrder(Integer userId, Integer itemId,Integer promoId, Integer amount) throws BussinessException {
//1.校验下单状态(用户是否合法,下单商品是否存在,购买数量是否正确)
ItemModel itemModel = itemService.getItemById(itemId);
if(itemModel == null) {
throw new BussinessException((EmBusinessError.PARAMETER_VALIDATION_ERROR),"商品不存在");
}
UserModel userModel = userService.getUserById(userId);
if(userId == null) {
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"用户不存在");
}
if(amount <= 0 || amount > 99){
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"数量信息不正确");
}
// 校验活动信息
if(promoId != null) {
// 1. 校验对应活动是否存在对应商品
if(promoId.intValue() != itemModel.getPromoModel().getId()) {
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"活动信息不正确");
} else if(itemModel.getPromoModel().getStatus().intValue() != 2){
// 2。校验活动是否在进行中
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"活动未开始");
}
}
//2.落单减库存,
boolean result = itemService.decreaseStock(itemId,amount);
if(!result) {
throw new BussinessException(EmBusinessError.STOCK_NOT_ENOUGH);
}
//3.订单入库
OrderModel orderModel = new OrderModel();
orderModel.setUserId(userId);
orderModel.setItemId(itemId);
orderModel.setAmount(amount);
if(promoId != null) {
orderModel.setItemPrice(itemModel.getPromoModel().getPromoItemPrice());
} else {
orderModel.setItemPrice(itemModel.getPrice());
}
orderModel.setPromoId(promoId);
orderModel.setOrderPrice(orderModel.getItemPrice().multiply(BigDecimal.valueOf(amount)));
//生成交易流水号,订单号
orderModel.setId(generatorOrderNo());
OrderDO orderDO = convertFromOrderModel(orderModel);
orderDOMapper.insertSelective(orderDO);
//商品销量增加
itemService.increaseSales(itemId,amount);
//返回前端
return orderModel;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
String generatorOrderNo(){
//1.订单号有16位
StringBuilder stringBuilder = new StringBuilder();
//前8位为时间信息,年月日
LocalDateTime now = LocalDateTime.now();
String nowDate = now.format(DateTimeFormatter.ISO_DATE).replace("-","");
stringBuilder.append(nowDate);
//2.中间六位为自增序列
//获取当前sequence
int sequence = 0;
SequenceDO sequenceDO = sequenceDOMapper.selectByPrimaryKey("order_info");
sequence = sequenceDO.getCurrentValue();
sequenceDO.setCurrentValue(sequenceDO.getCurrentValue()+sequenceDO.getStep());
sequenceDOMapper.updateByPrimaryKeySelective(sequenceDO);
//凑足六位
String sequenceStr = String.valueOf(sequence);
for(int i = 0; i < 6 - sequenceStr.length(); i++) {
stringBuilder.append(0);
}
stringBuilder.append(sequenceStr);
//3.最后两位分库分表位
stringBuilder.append("00");
return stringBuilder.toString();
}
private OrderDO convertFromOrderModel(OrderModel orderModel){
if(orderModel == null){
return null;
}
OrderDO orderDO = new OrderDO();
BeanUtils.copyProperties(orderModel,orderDO);
return orderDO;
}
}
PromoServiceImpl
@Service
public class PromoServiceImpl implements PromoService {
@Autowired
PromoDOMapper promoDOMapper;
@Override
public PromoModel getPromoById(Integer itemId) {
//获取对应商品的秒杀信息
PromoDO promoDO = promoDOMapper.selectByItemId(itemId);
PromoModel promoModel = convertFromDataObject(promoDO);
if(promoModel == null) {
return null;
}
//判断秒杀活动的当前状态
DateTime now = new DateTime();
if(promoModel.getStartDate().isAfterNow()){
promoModel.setStatus(1);
} else if(promoModel.getEndDate().isBeforeNow()) {
promoModel.setStatus(3);
} else {
promoModel.setStatus(2);
}
return promoModel;
}
private PromoModel convertFromDataObject(PromoDO promoDO){
if(promoDO == null) {
return null;
}
PromoModel promoModel = new PromoModel();
BeanUtils.copyProperties(promoDO,promoModel);
promoModel.setStartDate(new DateTime(promoDO.getStartDate()));
promoModel.setEndDate(new DateTime(promoDO.getEndDate()));
return promoModel;
}
}
UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDOMapper userDOMapper;
@Autowired
private UserPasswordDOMapper userPasswordDOMapper;
@Autowired
private ValidatorImpl validator;
//为什么不直接返回
@Override
public UserModel getUserById(Integer id) {
//调用userdomapper获取到dataobject
UserDO userDO = userDOMapper.selectByPrimaryKey(id);
if (userDO == null) {
return null;
}
//通过用户id获取用户加密密码信息
UserPasswordDO userPasswordDO = userPasswordDOMapper.selectByUserId(userDO.getId());
return convertFromDataObject(userDO, userPasswordDO);
}
@Transactional
@Override
public void register(UserModel userModel) throws BussinessException {
if (userModel == null) throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
ValidationResult result = validator.validate(userModel);
System.out.println(result.getErrMsg()+"result");
if (result.isHasErrors()) {
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
}
//实现model->dataobject方法
UserDO userDO = convertFromModel(userModel);
//使用insertSelective而不是insert,insertSelective会将对象为null的字段不进行插入,使这个字段依赖数据库的默认值。
try {
userDOMapper.insertSelective(userDO);
} catch (DuplicateKeyException e) {
throw new BussinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"手机号已被注册!");
}
userModel.setId(userDO.getId());
UserPasswordDO userPasswordDO = convertPasswordFromModel(userModel);
userPasswordDOMapper.insertSelective(userPasswordDO);
}
@Override
public UserModel validateLogin(String telphone, String encrptPassword) throws BussinessException {
//通过用户的手机获取用户信息
UserDO userDO = userDOMapper.selectByTelphone(telphone);
if(userDO == null) {
throw new BussinessException(EmBusinessError.USER_LOGIN_FAIL);
}
UserPasswordDO userPasswordDO = userPasswordDOMapper.selectByUserId(userDO.getId());
UserModel userModel = convertFromDataObject(userDO,userPasswordDO);
//拿到用户信息内加密的密码是否和传输的是否相匹配
if(!StringUtils.equals(encrptPassword,userModel.getEncrptPassword())){
throw new BussinessException(EmBusinessError.USER_LOGIN_FAIL);
}
return userModel;
}
private UserPasswordDO convertPasswordFromModel(UserModel userModel){
if(userModel == null) {
return null;
}
UserPasswordDO userPasswordDO = new UserPasswordDO();
userPasswordDO.setEncrptPassword(userModel.getEncrptPassword());
userPasswordDO.setUserId(userModel.getId());
return userPasswordDO;
}
private UserDO convertFromModel(UserModel userModel){
if(userModel == null) {
return null;
}
UserDO userDO = new UserDO();
BeanUtils.copyProperties(userModel,userDO);
return userDO;
}
private UserModel convertFromDataObject(UserDO userDO, UserPasswordDO userPasswordDO) {
if (userDO == null) {
return null;
}
UserModel userModel = new UserModel();
BeanUtils.copyProperties(userDO, userModel);
if (userPasswordDO != null) {
userModel.setEncrptPassword(userPasswordDO.getEncrptPassword());
}
return userModel;
}
}
ItemModel
@Data
public class ItemModel {
private Integer id;
@NotBlank(message = "商品名称不能为空")
private String title;
@NotNull(message = "商品价格不能为空")
@Min(value = 0,message = "商品价格要大于0")
private BigDecimal price;
@NotNull(message = "商品库存不能为空")
private Integer stock;
@NotBlank(message = "商品描述不能为空")
private String description;
private String sales;
@NotBlank(message = "商品图片不能为空")
private String imgUrl;
//使用聚合模型,如果promoModel不为空,则表示其拥有还未结束的秒杀活动
private PromoModel promoModel;
}
OrderModel
@Data
public class OrderModel {
//要用string
private String id;
private Integer userId;
private Integer itemId;
private BigDecimal itemPrice;
private Integer amount;
private BigDecimal orderPrice;
//若非空,表示以秒杀方式下单
private Integer promoId;
}
PromoModel
@Data
public class PromoModel {
private Integer id;
//秒杀活动状态,1表示还未开始,2表示进行中,3表示已结束
private Integer status;
//秒杀活动名称
private String promoName;
//秒杀开始时间
private DateTime startDate;
private DateTime endDate;
//秒杀活动使用商品
private Integer itemId;
//秒杀获得的商品价格
private BigDecimal promoItemPrice;
}
UserModel
@Data
public class UserModel {
private Integer id;
@NotBlank(message = "姓名不能为空")
private String name;
@NotNull(message = "姓名不能为空")
private Byte gender;
@NotNull(message = "年龄不能为空")
@Min(value = 0,message = "年龄不能小于0")
@Max(value = 150,message = "年龄不能大于150")
private Integer age;
@NotBlank(message = "手机号不能为空")
private String telphone;
private String registerMode;
private String thirdPartyId;
@NotBlank(message = "密码不能为空")
private String encrptPassword;
}
ItemService
public interface ItemService {
//创建商品
ItemModel createItem(ItemModel itemModel) throws BussinessException;
//商品列表浏览
List<ItemModel> listItem();
//商品详细浏览
ItemModel getItemById(Integer id);
//库存扣减
boolean decreaseStock(Integer itemId,Integer amount);
//商品下单后对应销量增加
void increaseSales(Integer itemId,Integer amount) throws BussinessException;
}
OrderService
public interface OrderService {
//1.通过前端url上传过来秒杀活动id,然后
//2.直接在下单接口内判断对应商品是否在秒杀
OrderModel createOrder(Integer userId,Integer itemId,Integer promoId,Integer amount) throws BussinessException;
}
PromoService
public interface PromoService {
PromoModel getPromoById(Integer itemId);
}
UserService
public interface UserService {
//通过对象id获取对象
UserModel getUserById(Integer id);
//注册
void register(UserModel userModel) throws BussinessException;
/**
* 登陆验证
* @param telphone 用户注册的手机
* @param encrptPassword 用户加密后的密码
*/
UserModel validateLogin(String telphone,String encrptPassword) throws BussinessException;
}
ValidationResult
public class ValidationResult {
/**
* 校验结果是否有错
*/
@Setter
private boolean hasErrors = false;
/**
* 存放错误信息的map
*/
@Getter
@Setter
private Map<String, String> errorMsgMap = new HashMap<>();
public boolean isHasErrors() {
return hasErrors;
}
/**
* 实现通用的通过格式化字符串信息获取错误结果的msg方法
*
* @return
*/
public String getErrMsg() {
return StringUtils.join(errorMsgMap.values().toArray(), ",");
}
}
ValidatorImpl
@Component
public class ValidatorImpl implements InitializingBean {
private Validator validator;
public ValidationResult validate(Object bean) {
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(bean);
if (constraintViolationSet.size() > 0) {
// 有错误
result.setHasErrors(true);
constraintViolationSet.forEach(constraintViolation -> {
String errMsg = constraintViolation.getMessage();
String propertyName = constraintViolation.getPropertyPath().toString();
result.getErrorMsgMap().put(propertyName, errMsg);
});
}
return result;
}
@Override
public void afterPropertiesSet() throws Exception {
// 将hibernate validator通过工厂的初始化方式使其实例化
this.validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}