当前位置: 首页 > news >正文

MVC应用单元测试以及请求参数的验证

SpringMVC支持对Controller单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:mvc-dispatcher-servlet.xml",
})
@WebAppConfiguration
public class ControllerJUnitBase{@Resourceprivate RequestMappingHandlerMapping handlerMapping;@Resource private RequestMappingHandlerAdapter handlerAdapter;//执行request对象请求的actionpublic ModelAndView excuteAction(HttpServletRequest request,HttpServletResponse response)throws Exception{HandlerExecutionChain chain = handlerMapping.getHandler(request);final ModelAndView model = handlerAdapter.handle(request,response,chain.getHeader());return model;}@Testpublic void test throws Exception(){//Mock构建request,responseMockHttpServletRequest request = new MockHttpServletRequest();request.setRequestURI("/api/user/login");request.setParameter("mobile","190xxxx1234");request.setMethod("POST");MockHttpServletResponse response = new MockHttpServletResponse();final ModelAndView mav = this.excuteAction(request,response);Assert.assertEquals("user_login",mav.getViewName());}
}		

验证Web请求参数

一、通过Spring框架定义的Validator接口定义的校验

public class UserValidator implements Validator{@Overridepublic boolean supports(Class<?> clazz){return clazz.equals(User.class);}@Overridepublic void validate(Object target,Errors errors){ValidationUtils.rejectIfEmpty(errors,"name","user.name.required","用户名不能为空");User user = (User)target;if(length > 10){errors.rejectValue("name","user.name.too_long","用户不能超过20个字符");}}
}	

在Controller里增加方法并以@InitBinder注解在对应的Controller方法中触发

@InitBinder
protected void initBinder(WebDataBinder binder){binder.setValidator(new UserValidator());
}@RequestMapping(method = RequestMethod.POST)
public String reg(@Validated User user,BindingResult result){//如果校验没有通过if(result.hasErrors()){return "user";}if(user != null){userService.saveUser(user);}return "user";
}

从页面提交的User对象,通过实现的UserValidator类校验,校验结果存入BindingResult对象中

二、支持JSR-303 Beam Validator定义的校验规范

不仅可以对Spring的MVC进行校验,也可以对Hibernate的存储对象进行校验
引入hibernate-validator,并开启MVC注解mvc:annotation-driven/

还需要对校验的meta类的属性做注解限制

  • @Null 验证对象是否为空
  • @NotNull 验证对象是否为非空
  • @AssertTrue 验证Boolean对象是否为true
  • @AssertFalse验证Boolean对象是否为false
  • @Min 验证Number和String对象是否大于或等于指定的值
  • @Max 验证Number和String对象是否小于或等于指定的值
  • @DecimalMin 验证Number和String对象是否大于或等于指定的值,需要注意小数的精度问题
  • @DecimalMax 验证Number和String对象是否小于或等于指定的值,需要注意小数点的精度问题
  • @Size 验证对象(Array,Collection,Map,String)长度是否在给定的范围内
  • @Digits 验证Number和String的构成是否合法
  • @Past 验证Date和Calendar对象是否在当前时间之前
  • @Future 验证Date和Calendar对象是否在当前时间之后
  • @Pattern 验证String对象是否符合正则表达式的规则

此外hibernate-validator也提供了一些注解支持

  • @NotEmpty 验证对象不为NULL也不为empty
  • @NotBlank 验证对象NULL也不为empty,连续的空格也被认为是empty
  • @Range 验证对象在指定的范围内

配置:只要队被校验的meta注解Constraint

public class User{@NotNullprivate String name;
}

然后Controller对应的方法中,给对应的参数@Valid注解

public String doRegister(@Valid User user,BindingResult result){//校验没有通过if(result.hasErrors()){return "user";}if(user != null){userService.saveUser(user);}return "user";
}

这样就完成了针对输入数据User对象的校验了,校验结果保存在BindingResult对象中
BindingResult参数如果放在验证参数的后面,那么错误信息是会绑定到此BindingResult上的,否则会抛出MethodArgumentNotValidException异常

http://www.lryc.cn/news/439299.html

相关文章:

  • 算法:TopK问题
  • .json文件的C#解析,基于Newtonsoft.Json插件
  • 四、(JS)JS中常见的加载事件
  • [网络]https的概念及加密过程
  • React 嵌套类名样式不生效
  • 20Kg载重30分钟续航多旋翼无人机技术详解
  • 详解c++:认识类
  • HTML5中的重要元素详解
  • 八股文知识汇总(常考)
  • unity 图片置灰shader
  • 【C语言】(指针系列2)指针运算+指针与数组的关系+二级指针+指针数组+《剑指offer面试题》
  • 探索信号处理:使用傅里叶小波变换分析和恢复信号
  • 俄罗斯方块——C语言实践(Dev-Cpp)
  • 关于wp网站出现的问题
  • 为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白
  • 最全 高质量 大模型 -评估基准数据集(不定期更新)
  • react 中, navigate 跳转链接 2种写法
  • k8s Service 服务
  • 安全建设当中的冷门知识
  • python画图|极坐标下的3D surface
  • html+css+js网页设计 旅游 大理旅游7个页面
  • Day 29~42 JavaWeb
  • 小程序开发设计-第一个小程序:创建小程序项目④
  • C++设计模式——Mediator中介者模式
  • 微服务之间远程调用实现思路
  • 获取STM32 MCU的唯一ID
  • Debian项目实战——环境搭建篇
  • CenterNet官方代码—目标检测模型推理部分解析与项目启动
  • 测试开发基础——测试用例的设计
  • C++第五十一弹---IO流实战:高效文件读写与格式化输出