参数校验实战
1. 加校验机制(注解)
两种校验参数
- 方法上的参数,直接在参数上添加校验注解,同时需要在类上加注解@Validated
- 参数有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);
}
}
}