用jsr303 做入参校验,自己写一个注解,全局异常处理

pom

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

然后是在vo
中加入相应的注解

package com.home.miaosha.entity;


import com.home.miaosha.validate.IsMobile;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

public class LoginVo {
    @NotNull
    @IsMobile
    private String mobile;
    @NotEmpty
    @Length(min = 6)
    private String password;


    @Override
    public String toString() {
        return "LoginVo{" +
                "mobile='" + mobile + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

在controller加入注解
@Valid

 package com.home.miaosha.controller;

import com.home.miaosha.entity.CodeMsg;
import com.home.miaosha.entity.LoginVo;
import com.home.miaosha.entity.MiaoUser;
import com.home.miaosha.entity.Result;
import com.home.miaosha.service.MiaoUserService;
import com.home.miaosha.utils.MD5Utils;
import com.home.miaosha.utils.ValiUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
public class LoginCon {

    @Autowired
    MiaoUserService miaoUserService;

    @GetMapping("/login")
    public Result<Boolean> login(@Valid LoginVo loginVo) {
//        if (StringUtils.isEmpty(loginVo.getMobile())) {
//            return Result.error(CodeMsg.MOBILE_EMPTY);
//        }
//        if (!ValiUtils.isMobile(loginVo.getMobile())) {
//            return Result.error(CodeMsg.MOBILE_ERROR);
//        }
//
//        if (StringUtils.isEmpty(loginVo.getPassword())) {
//            return Result.error(CodeMsg.PASSWORD_EMPTY);
//        }
        System.out.println(loginVo);

        boolean res = miaoUserService.id(loginVo);
        return Result.success(res);





    }

}

全局异常处理类,用自己的方式放回错误信息

package com.home.miaosha.exception;

import com.home.miaosha.entity.CodeMsg;
import com.home.miaosha.entity.Result;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;

@ControllerAdvice
@ResponseBody
public class GlobalHandler {
    @ExceptionHandler(Exception.class)
    public Result<String> exceptionHandler(HttpServletRequest request
            , Exception e) {
        if (e instanceof BindException) {
            BindException bindException = (BindException) e;

            List<ObjectError> allErrors = bindException.getAllErrors();
            List<String> collect = allErrors.stream().map(x -> x.getDefaultMessage()).collect(Collectors.toList());


//            ObjectError objectError = allErrors.get(0);
//            String msg = objectError.getDefaultMessage();
            return Result.error(CodeMsg.BIND_ERROR.fillArgs(collect.toArray()));

        }else if(e instanceof GlobalException){
            GlobalException globalException = (GlobalException) e;
            CodeMsg codeMsg = globalException.getCodeMsg();

            return Result.error(codeMsg);

        }else {
            return Result.error(CodeMsg.ERROR);
        }
    }
}

自己定义一个运行时异常,其实返回的还是本身的异常。

package com.home.miaosha.exception;

import com.home.miaosha.entity.CodeMsg;
import lombok.Data;

@Data
public class GlobalException extends RuntimeException

{

    private CodeMsg codeMsg;

  public   GlobalException(CodeMsg codeMsg) {

        this.codeMsg = codeMsg;
    }
}

自己定义的注解

package com.home.miaosha.validate;


import org.hibernate.validator.constraints.Length;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {MobileVali.class}
)
public @interface IsMobile {

    boolean required() default true;
    int max() default 2147483647;

    String message() default "手机号码格式有误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

相对应的处理类

package com.home.miaosha.validate;

import com.home.miaosha.utils.ValiUtils;
import org.springframework.util.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MobileVali implements ConstraintValidator<IsMobile, String> {

    boolean required ;

    @Override
    public void initialize(IsMobile constraintAnnotation) {
      required = constraintAnnotation.required();

    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (required) {
            return ValiUtils.isMobile(s);

        }else{

            if (StringUtils.isEmpty(s)) {
                    return true;
            }else{
                return ValiUtils.isMobile(s);
            }

        }


    }
}

service

package com.home.miaosha.service;

import com.home.miaosha.dao.MiaoUserDao;
import com.home.miaosha.entity.CodeMsg;
import com.home.miaosha.entity.LoginVo;
import com.home.miaosha.entity.MiaoUser;
import com.home.miaosha.entity.Result;
import com.home.miaosha.exception.GlobalException;
import com.home.miaosha.utils.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MiaoUserService {

    @Autowired
    MiaoUserDao miaoUserDao;

    public boolean id(LoginVo loginVo) {
        long id = Long.parseLong(loginVo.getMobile());
        MiaoUser user = miaoUserDao.id(id);
        if (user == null) {
            throw  new GlobalException(CodeMsg.MOBILE_NOT_EXIST);

        }

        String password = user.getPassword();
        String salt = user.getSalt();
        String second = MD5Utils.second(loginVo.getPassword() + "", salt);
        if (!password.equals(second)) {
            throw new GlobalException( CodeMsg.PASSWORD_NOT_EXIST);

        }
        return true;

    }
}

基本的使用应该是4步
1,引入pom
2,vo上注解
3,入参上一个开启注解
4,一个统一定制的异常返回。 有两个注解。
其余的再慢慢完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值