zoukankan      html  css  js  c++  java
  • 测试开发进阶——spring boot——MVC——Spring MVC框架的数据验证——校验框架 @Valid 和 @Validated的使用

     

     

     

    /**
     * 多个对象校验
     * @param user
     * @param bindingResult
    */
    @RequestMapping("/user/saveAll")
    public void saveAll(@Validated User user, BindingResult bindingResult,@Validated Student student, BindingResult bindingResult2) {
        if (bindingResult.hasErrors()) {
            for (ObjectError error : bindingResult.getAllErrors()) {
                System.out.println(error.getDefaultMessage());
            }
    
        }
        System.out.println("-----------");
    
        if (bindingResult2.hasErrors()) {
            for (ObjectError error : bindingResult2.getAllErrors()) {
                System.out.println(error.getDefaultMessage());
            }
    
        }
    }
    

      

     

     

     

     

     

     

    @Validated   //第1步,告诉MethodValidationPostProcessor此Bean需要开启方法级别验证支持
    @RestController
    public class ValidationController {
    
    	@RequestMapping(value = "/validation/demo")
    	public void demo1(
    			@Range(min = 1, max = 9, message = "年级只能从1-9")   //第2步
    			@RequestParam(name = "grade", required = true) int grade, //
    			
    			@Min(value = 1, message = "班级最小只能1") @Max(value = 99, message = "班级最大只能99")  //第2步
    			@RequestParam(name = "classroom", required = true) int classroom) { //
    
    		System.out.println(grade + "," + classroom);
    	}
    }
    

      

    测试:

    package com.awaimai.web;
    
    import org.hibernate.validator.constraints.Range;
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.validation.Valid;
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    
    
    @Controller
    @Validated
    public class kzq
    {
    
    
    
        @RequestMapping(value = "/test8")
        @ResponseBody
        public String test8(@RequestParam(name = "a", required = true) @Range(min = 1, max = 9, message = "年级只能从1-9") int a, 
    @Min(value = 1, message = "班级最小只能1") @Max(value = 99, message = "班级最大只能99") int b) { System.out.println(a + "," + b); return "123"; } }

      

    执行:

     

     

     

    下面提供一种全局的异常信息捕获方法:

    使用 @ControllerAdvice 注解,具本如下:

    @ControllerAdvice
    @Component
    public class GlobalExceptionHandler {
    
    	/**
    	 * 拦截捕捉 MissingServletRequestParameterException 异常
    	 */
    	@ResponseBody
    	@ExceptionHandler(value = MissingServletRequestParameterException.class)
    	public String doMissingServletRequestParameterHandler(MissingServletRequestParameterException exception) {
    		MissingServletRequestParameterException exs = (MissingServletRequestParameterException) exception;
    		System.err.println(exs.getMessage());
    		return "bad request, ";
    	}
    
    	/**
    	 * 拦截捕捉 ConstraintViolationException 异常
    	 */
    	@ResponseBody
    	@ExceptionHandler(value = ConstraintViolationException.class)
    	public Map ConstraintViolationExceptionHandler(ConstraintViolationException ex) {
    		Map map = new HashMap();
    		Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
    		Iterator<ConstraintViolation<?>> iterator = constraintViolations.iterator();
    		List<String> msgList = new ArrayList<>();
    		while (iterator.hasNext()) {
    			ConstraintViolation<?> cvl = iterator.next();
    			System.err.println(cvl.getMessageTemplate());
    			msgList.add(cvl.getMessageTemplate());
    		}
    		map.put("status", 500);
    		map.put("msg", msgList);
    		return map;
    	}
    
        /**
    	 * 拦截捕捉 MethodArgumentNotValidException 异常
    	 */
        @ExceptionHandler(MethodArgumentNotValidException.class)
    	public Map  doMethodArgumentNotValidException2(MethodArgumentNotValidException ex){
    	    Map map = new HashMap();
    	    map.put("status", 500);
    		map.put("msg", "请求异常");
    		
    		BindingResult result = ex.getBindingResult();
    		List<String> msgList = new ArrayList<String>();
    		if (result.hasErrors()) {
    			List<ObjectError> errors = result.getAllErrors();
    			ObjectError error=errors.get(0);
    			msgList.add(error.getDefaultMessage());
    			String firstMsg=msgList.get(0);			
    		    map.put("msg", msgList);
    			return map ;
    		}
    		return map ;
    	}
    	
       /**
    	 * 拦截捕捉 BindException 异常
    	 */
    	@ExceptionHandler(BindException.class)
    	@ResponseBody
    	public R handleBindException(BindException ex) {
    		List<FieldError> bindingResult = ex.getBindingResult().getFieldErrors();
    		List<String> msgList = new ArrayList<String>();
    		for (FieldError fieldError : bindingResult) {
    			System.err.println(fieldError.getField() + " " + fieldError.getDefaultMessage());
    			msgList.add(fieldError.getDefaultMessage());
    		}
    		String firstMsg = msgList.get(0);
    		return R.error(firstMsg);
    	}
    
    }
    

     

     

  • 相关阅读:
    VBS 操作Word
    VirtualMachineManager
    openssl用法详解
    JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
    js实现touch移动触屏滑动事件
    JavaScript 获得代码行号和脚本文件名
    js的调用函数前先执行某语句问题
    结构型模式概述(Structural Pattern)
    适配器模式(Adapter Pattern)----------结构型模式
    CSAPP chapter2 记录(bit_level_coding)
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/15114579.html
Copyright © 2011-2022 走看看