用户工具

站点工具


分享:技术:validation:hibernate_validator

这是本文档旧的修订版!


hibernate_validator

介绍

hibernate_validator是hibernate提供的参数校验框架,通过在pojo类属性上加限制注解,再通过工具类校验参数,将异常抛出。

maven引入

maven引入:pom.xml

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>${hibernate-validator.version}</version>
</dependency>

spring配置文件

spring配置文件,比如:application-context.xml

	<!-- 参数校验AOP begin -->
	<bean id="validateAop" class="com.gxx.record.core.ValidateAop" />
	<aop:config>
		<aop:aspect id="validateAspect" ref="validateAop">
			<aop:pointcut id="target" expression="execution(* com.gxx.record.service..*.*(..))" />
			<aop:around method="around" pointcut-ref="target" />
		</aop:aspect>
	</aop:config>
	<!-- 参数校验AOP end -->

方法注解

切面扫描方法,方法上有这个注解@Validate,才会去校验每个入参的属性

Validate.java
package com.gxx.record.core;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/** 
 * 校验参数注解
 * @author Gxx
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Validate {
	/**
	 * 是否校验参数
	 * true才校验
	 * @return
	 */
	boolean isValidate() default false;
}

切面类

ValidateAop.java
package com.gxx.record.core;
 
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
 
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
 
import com.gxx.record.utils.ValidationUtils;
 
/**
 * 服务层AOP
 * @author Gxx
 */
public class ValidateAop {
 
	/**
	 * 日志处理器
	 */
	private final Logger logger = Logger.getLogger(ValidateAop.class);
 
	/**
	 * 方法前后操作
	 * @param pjp
	 * @return
	 * @throws Exception
	 */
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		/**
		 * 获取切面方法
		 */
		Signature sig = pjp.getSignature();
		MethodSignature msig = null;
		if (!(sig instanceof MethodSignature)) {
			throw new IllegalArgumentException("该注解只能用于方法");
		}
		msig = (MethodSignature) sig;
		Object target = pjp.getTarget();
		Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
 
		/**
		 * 判断是否加注解@LogMethodTime 和 是否落地
		 */
		boolean isValidateAnnotation = currentMethod.isAnnotationPresent(Validate.class);//是否加注解@Validate
		/**
		 * 判断是否加注解@Validate
		 */
		if(isValidateAnnotation) {
			Annotation p = currentMethod.getAnnotation(Validate.class);
 
			Method m = p.getClass().getDeclaredMethod("isValidate", null);
			boolean isValidate = (Boolean) m.invoke(p, null);
			/**
			 * 是否需要校验
			 */
			if(isValidate) {
				/**
				 * 参数校验
				 */
				Object[] args = pjp.getArgs();
				if(null != args && args.length > 0) {
					for(Object arg : args) {
						ValidationUtils.validate(arg);
					}
				}
			}
		}
 
		/**
		 * 执行方法
		 */
		return pjp.proceed();
	}
}

校验工具类

ValidationUtils.java
package com.gxx.record.utils;
 
import java.util.Set;
 
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
 
import org.hibernate.validator.HibernateValidator;
 
/**
 * 校验工具类
 * @author Gxx
 */
public class ValidationUtils {
    /**
     * 使用hibernate的注解来进行验证
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class)
    		.configure().failFast(true).buildValidatorFactory().getValidator();
 
    /**
     * 校验
     * @param obj
     */
    public static <T> void validate(T obj) {
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
        /**
         * 抛出检验异常
         */
        if (constraintViolations.size() > 0) {
            throw new RuntimeException(String.format("参数校验失败:%s", constraintViolations.iterator().next().getMessage()));
        }
    }
}

请求入口类

UserController.java
package com.gxx.record.web.user;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.gxx.record.dto.UserDto;
import com.gxx.record.service.UserService;
 
/**
 * <dl>
 *    <dt><b>Title:</b></dt>
 *    <dd>
 *    	none
 *    </dd>
 *    <dt><b>Description:用户控制器</b></dt>
 *    <dd>
 *    	<p>none
 *    </dd>
 * </dl>
 *
 * @author Administrator
 * @version 1.0, 2017年12月14日
 * @since record
 *
 */
@Controller
@RequestMapping("/user/")
public class UserController {
 
	@Autowired
	private UserService userService;
 
	/**
	 * 校验
	 * @param request
	 * @param userDto
	 * @return
	 */
	@RequestMapping(value = "/validate", produces="application/json")
	public @ResponseBody String validate(HttpServletRequest request, UserDto userDto) {
		return userService.validate(userDto);
	}
}

pojo类

UserDto.java
package com.gxx.record.dto;
 
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
 
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.URL;
 
/**
 * <dl>
 *    <dt><b>Title:</b></dt>
 *    <dd>
 *    	用户传输对象
 *    </dd>
 *    <dt><b>Description:</b></dt>
 *    <dd>
 *    	<p>none
 *    </dd>
 * </dl>
 *
 * @author Administrator
 * @version 1.0, 2017年12月14日
 * @since record
 *
 */
public class UserDto {
 
	@NotNull(message = "昵称不能为空")
	private String validNick;
 
	@NotEmpty(message = "姓名不能为空字符串")
	private String validName;
 
	@AssertTrue(message = "钱必须是真的")
	private boolean validMoney;
 
	@Max(value=10, message = "数字不能大于10")
	@Min(value=5, message = "数字不能小于5")
	private int validNumber;
 
	@NotEmpty(message = "字符串不能为空字符串")//如果不配置NotEmpty而且为空,则不校验Length
	@Length(min=5, max=10, message = "字符串长度有误")
	private String validString;
 
	@NotEmpty(message = "email不能为空字符串")//如果不配置NotEmpty而且为空,则不校验Email
	@Email(message = "email格式有误")
	private String validEmail;
 
	@NotEmpty(message = "url不能为空字符串")//如果不配置NotEmpty而且为空,则不校验URL
	@URL(message = "url格式有误")
	private String validUrl;
 
	public String getValidName() {
		return validName;
	}
	public void setValidName(String validName) {
		this.validName = validName;
	}
	public boolean isValidMoney() {
		return validMoney;
	}
	public void setValidMoney(boolean validMoney) {
		this.validMoney = validMoney;
	}
	public String getValidEmail() {
		return validEmail;
	}
	public void setValidEmail(String validEmail) {
		this.validEmail = validEmail;
	}
	public String getValidString() {
		return validString;
	}
	public void setValidString(String validString) {
		this.validString = validString;
	}
	public int getValidNumber() {
		return validNumber;
	}
	public void setValidNumber(int validNumber) {
		this.validNumber = validNumber;
	}
	public String getValidUrl() {
		return validUrl;
	}
	public void setValidUrl(String validUrl) {
		this.validUrl = validUrl;
	}
	public String getValidNick() {
		return validNick;
	}
	public void setValidNick(String validNick) {
		this.validNick = validNick;
	}
}

服务接口

UserService.java
package com.gxx.record.service;
 
import com.gxx.record.dto.UserDto;
 
/**
 * <dl>
 *    <dt><b>Title:</b></dt>
 *    <dd>
 *    	用户服务接口
 *    </dd>
 *    <dt><b>Description:</b></dt>
 *    <dd>
 *    	<p>none
 *    </dd>
 * </dl>
 *
 * @author Administrator
 * @version 1.0, 2017年12月14日
 * @since record
 *
 */
public interface UserService {
 
	/**
	 * 校验接口
	 * @param userDto
	 * @return
	 */
	public String validate(UserDto userDto);
}

服务实现类

UserServiceImpl.java
package com.gxx.record.service.impl;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.gxx.record.base.dao.UserMapper;
import com.gxx.record.base.vo.User;
import com.gxx.record.core.Datasource;
import com.gxx.record.core.Validate;
import com.gxx.record.dto.UserDto;
import com.gxx.record.service.UserService;
 
/**
 * <dl>
 *    <dt><b>Title:</b></dt>
 *    <dd>
 *    	用户服务实现类
 *    </dd>
 *    <dt><b>Description:</b></dt>
 *    <dd>
 *    	<p>none
 *    </dd>
 * </dl>
 *
 * @author Administrator
 * @version 1.0, 2017年12月14日
 * @since record
 *
 */
@Service("userService")
public class UserServiceImpl implements UserService {
 
	/**
	 * 校验接口
	 * @param userDto
	 * @return
	 */
	@Validate(isValidate = true)
	public String validate(UserDto userDto) {
		return "OK";
	}
}
分享/技术/validation/hibernate_validator.1513247832.txt.gz · 最后更改: 2017/12/14 18:37 由 gxx