参数校验实战

1. 加校验机制(注解)

两种校验参数

  1. 方法上的参数,直接在参数上添加校验注解,同时需要在类上加注解@Validated
  2. 参数有bean的校验,public Result<String> demoValid2(@RequestBody @Validated User user) throws Exceptio直接在参数前面加注解@Validated
import javax.validation.constraints.Min;

import org.hibernate.validator.constraints.NotBlank;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import ly.net.common.Result;
import ly.net.service.BorrowRecordService;

/**
 * 借款记录
 * @author wms
 *
 */
@RestController
@RequestMapping("/borrow-record")
@Validated
public class BorrowRecordController {

    private static final Logger logger = LoggerFactory.getLogger(BorrowRecordController.class);


    @GetMapping("/demoValid")
    @ApiOperation(value = "测试", notes = "#####"
            + "#####输出:")
    @ApiImplicitParams({ 
            @ApiImplicitParam(name = "username", value = "用户名", dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "age", value = "年龄", dataType = "int", paramType = "query"),

    })
    public Result<String> demoValid(@NotBlank(message = "用户名不能为null") String username,@Min(value = 5,message = "最小值是5")Integer age) throws Exception{
        if(2 > 1) {

            throw new Exception("我愿意");
        }

        return new Result<String>("111", "111", 2);
    }

    @PostMapping("/demoValid2")
    @ApiOperation(value = "测试", notes = "#####"
            + "#####输出:")
    public Result<String> demoValid2(@RequestBody @Validated User user) throws Exception{

        return new Result<String>("111", "111", 2);

    }

}

2. 获取默认提示信息并返回给前端

这里使用到了异常处理机制,如果参数校验不通过,请求是走不到Controller方法体上的,就抛出异常 我们可以在处理异常的时候,捕捉到异常,找到具体的错误信息 下面采用的是springboot的异常处理


import java.io.IOException;
import java.util.Enumeration;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import ly.net.common.Result;

@ControllerAdvice
@ResponseBody
public class BaseExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(BaseExceptionHandler.class);

    @ExceptionHandler
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Result<String> defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {

        logger.error("错误信息", e);
        String message = e.getMessage();
        String urlStr = req.getRequestURL().toString();
        logger.error(urlStr);
        logRequestBaseInfo(req);
        logger.error(message);
        return new Result<String>("操作错误", "抛异常了", 223);
    }

    // 针对方法参数校验错误捕捉
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public Result<String> constraintViolationException(HttpServletRequest req, ConstraintViolationException e) throws Exception {

        logger.error("错误信息", e);
        logger.error(req.getRequestURL().toString());
        logRequestBaseInfo(req);
        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
        ConstraintViolation<?> violation = violations.iterator().next();
        String message = violation.getMessage();

        return new Result<String>("操作错误", message, 222);
    }

    // 针对bean字段错误校验的捕捉
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(BindException.class)
    public Result<String> bindException(HttpServletRequest req, BindException e) throws Exception {

        logger.error("错误信息", e);

        logRequestBaseInfo(req);

        String message = e.getFieldError().getDefaultMessage();

        return new Result<String>("操作错误", message, 222);
    }
    // 针对bean字段错误校验的捕捉有requestBODY
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<String> methodArgumentNotValidException(HttpServletRequest req, MethodArgumentNotValidException e) throws Exception {

        logger.error("错误信息", e);
        logRequestBaseInfo(req);
        BindingResult bindingResult = e.getBindingResult();
        FieldError fieldError = bindingResult.getFieldError();
        String message = fieldError.getDefaultMessage();

        return new Result<String>("操作错误", message, 222);
    }

    private void logRequestBaseInfo(HttpServletRequest req) throws IOException {

        StringBuffer url = req.getRequestURL();
        if (req.getQueryString() != null) {
            url.append("?");
            url.append(req.getQueryString());
        }
        logger.error("url信息{}", url.toString());
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = (String) parameterNames.nextElement();
            String[] parameterValues = req.getParameterValues(parameterName);
            logger.info("请求参数信息:{}={}", parameterName, parameterValues);
        }
    }
}
Copyright © wu_mingsheng@126.com 2017 all right reserved,powered by Gitbook该文件最后修改时间: 2020-01-19 13:42:27

results matching ""

    No results matching ""