博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate-validator实现入参校验(包含get与post)
阅读量:7198 次
发布时间:2019-06-29

本文共 2287 字,大约阅读时间需要 7 分钟。

    最近在实现一个功能时,由于入参特别多,有的入参需要不为空,有的入参可以为空,这中间如果手动一个一个判断,重复代码太多,所以就想到了用hibernate-validator来实现。中间诸多波折,现分享如下。

    首先,引入maven依赖,具体的版本可以调整。

org.hibernate
hibernate-validator
5.1.3.Final
    然后,定义入参的一个实体类,比如student,用上一些注解:

import org.hibernate.validator.constraints.NotBlank;import org.springframework.stereotype.Component;@Component("ValidStudent")public class Student {	@NotBlank(message="缺少姓名")	private String name;		@NotBlank(message="缺少性别")	private byte sex;		private String id;	...}
下面是重点:

一、在处理get请求时,可以使用spring自带的注解,将入参转成所需的对象,同时利用注解进行非空及其他检查

@RequestMapping(value = "/addStudent", method = { RequestMethod.GET })public ModelAndView addStudent(HttpServletRequest request,	@ModelAttribute("ValidStudent") @Valid Student student, BindingResult bindingResult) {	ModelAndView mav = new ModelAndView();	if (bindingResult.hasErrors()) {// 入参认证不通过		mav.addObject(JSONViewResolver.KEY_REST_RESPONSE,				wrap("206000001", bindingResult.getAllErrors().get(0).getDefaultMessage()));		return mav;	} else {		return addStudent(student, request);	}}
get时需要入参中包含student的相关属性,利用@ModelAttribute这个注解就能进行对象属性赋值,@Valid能对属性进行检查。如果检查不通过,则错误信息存储在bindingResult中,可以取出bindingResult中的内容,来返回错误信息。

二、在处理post请求时,如果是表单,就比较简单,直接可以通过@ModelAttribute来转换对象,如果不是通过表单,纯粹通过参数,则比较麻烦,此时就不能用注解的方式来验证,需要通过代码来实现。

private static Validator validator;@PostConstructpublic static void setUp() {	ValidatorFactory factory = Validation.buildDefaultValidatorFactory();	validator = factory.getValidator();}
在controller中先初始化一个validator。

@RequestMapping(value = "/addStudent", method = { RequestMethod.POST })public ModelAndView addStudent(HttpServletRequest request) {	ModelAndView mav = new ModelAndView();	JSONObject msg = (JSONObject) request.getAttribute("msg");	Student student = JSON.toJavaObject(msg, OrderRequest.class);	Set
> constraintViolations = validator.validate(student); if (!constraintViolations.isEmpty()) {// 入参认证不通过 mav.addObject(JSONViewResolver.KEY_REST_RESPONSE, wrap("206000001", constraintViolations.iterator().next().getMessage())); return mav; } else { return addStudent(orderRequest, request); }}
可以先将入参通过fastjson转成对象,然后再调用validator.validate(T t)来验证,错误信息存储在constraintViolations中,这样就能拿出来了。

以上如有不妥,恳请指正。同时,post方式是否有更加简洁的注解方式解决,大家一起探讨。

转载地址:http://mlkum.baihongyu.com/

你可能感兴趣的文章
公瑾财务成“互联网+财税”领跑者
查看>>
工信部征集绿色数据中心先进适用技术产品
查看>>
LinkedIn的增长革命与增长哲学
查看>>
《伟大的小细节:互联网产品设计中的微创新思维》——3.1 设身处地为用户考虑...
查看>>
HTTP/2 与 WEB 性能优化(三)
查看>>
将移动App创意变成现实的十个关键步骤
查看>>
阿里云创建E-MapReduce 1 快速开始
查看>>
容器技术如何改变游戏服务器托管行业
查看>>
企业运营对 DevOps 的 “傲慢与偏见”
查看>>
企业云计算需求持续拓展 可信云认证或将备受青睐
查看>>
超融合将成为数据中心技术应用主流
查看>>
在PHP应用程序开发中不正当使用mail()函数引发的血案
查看>>
Android 开源项目推荐之“网络请求哪家强”
查看>>
数据中心遭破坏后如何恢复!!!
查看>>
360欲将传统路由变“智能”:伪需求+南辕北辙的产品理念
查看>>
内蒙古将建安全生产大数据中心
查看>>
雅虎面向研究人员发布大规模机器学习数据集
查看>>
物联网为主流技术带来减肥运动
查看>>
惊!使用300行代码创建一个分布式系统
查看>>
夏普推出高效太阳能椅 转换效率高达30%
查看>>