hibernate-validator实现入参校验(包含get与post)

简介:     最近在实现一个功能时,由于入参特别多,有的入参需要不为空,有的入参可以为空,这中间如果手动一个一个判断,重复代码太多,所以就想到了用hibernate-validator来实现。中间诸多波折,现分享如下。     首先,引入maven依赖,具体的版本可以调整。 <dependency> <groupId>org.hibernate</group

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

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

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>5.1.3.Final</version>
</dependency>
    然后,定义入参的一个实体类,比如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;

@PostConstruct
public 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<ConstraintViolation<student>> 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方式是否有更加简洁的注解方式解决,大家一起探讨。






目录
相关文章
|
SQL Java 数据库连接
Hibernate中Session的load和get方法的区别是什么?
主要有以下三项区别: ① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。 ② get方法直接返回实体类对象,load方法返回实体类对象的代理。
1061 0
|
Java 数据库连接 数据库
【hibernate 报错】No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer 【get和load的区别】
报错: 1 HTTP Status 500 - Could not write content: No serializer found for class org.hibernate.proxy.
1278 0
|
缓存 Java 数据库连接
Hibernate get和load区别
get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。   1.从返回结果上对比:load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null   2.从检索执行机制上对比: get方法和find方法都是
1198 0
|
机器学习/深度学习 缓存 Java
一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别
      最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深。所以百度了一下,结果问题来了。
967 0
|
缓存 Java 数据库连接
Hibernate学习之------&gt;Hibernate 中session的get()和load()比较
load读取: Java代码   Users user = (Users)session.load(Users.class, userId);       get读取: Java代码   Users user = (Users)session.
869 0