spring mvc4 hibernate validator 方法参数验证

maven依赖

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>

</dependency>


1.最简单配置

<mvc:annotation-driven validator="validator">
	</mvc:annotation-driven>

	<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
		<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
	</bean>
2.国际化 提示信息写到配置文件配置

	<mvc:annotation-driven validator="validator" conversion-service="conversion-service">
	</mvc:annotation-driven>


	<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
		<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
		<!-- 不设置则默认为classpath下的 ValidationMessages.properties -->
		<property name="validationMessageSource" ref="validatemessageSource" />
	</bean>
	<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
	<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basename" value="classpath:validatemessages" />
		<property name="fileEncodings" value="utf-8" />
		<property name="cacheSeconds" value="120" />
	</bean>

3.简单注解 介绍 注解 运行时检查

@AssertFalse						被注解的元素必须为false
@AssertTrue							被注解的元素必须为true
@DecimalMax(value)					被注解的元素必须为一个数字,其值必须小于等于指定的最小值
@DecimalMin(Value)					被注解的元素必须为一个数字,其值必须大于等于指定的最小值
@Digits(integer=, fraction=)		被注解的元素必须为一个数字,其值必须在可接受的范围内
@Future								被注解的元素必须是日期,检查给定的日期是否比现在晚
@Max(value)							被注解的元素必须为一个数字,其值必须小于等于指定的最小值
@Min(value)							被注解的元素必须为一个数字,其值必须大于等于指定的最小值
@NotNull							被注解的元素必须不为null
@Null								被注解的元素必须为null
@Past(java.util.Date/Calendar)		被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早
@Pattern(regex=, flag=)				被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配
@Size(min=, max=)					被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays)
@Valid								递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验
@CreditCardNumber					对信用卡号进行一个大致的验证
@Email								被注释的元素必须是电子邮箱地址
@Length(min=, max=)					被注解的对象必须是字符串的大小必须在制定的范围内
@NotBlank							被注解的对象必须为字符串,不能为空,检查时会将空格忽略
@NotEmpty							被注释的对象必须为空(数据:String,Collection,Map,arrays)
@Range(min=, max=)					被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 )
@URL(protocol=, host=, port=, regexp=, flags=)	被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

4.注解的使用 
4.1  controller 方法参数验证 ,在controller类名称上加 @Validated 注解

@Validated
public class OwnerController extends BaseController {
	@RequestMapping(value = "/test", method = { RequestMethod.GET, RequestMethod.POST })
	public void test(@DecimalMin("0") Integer status, @NotBlank String name) {

	}
}
4.2 参数为 bean的时候 在bean前加 @Valid

	@RequestMapping(value = "/test", method = { RequestMethod.GET, RequestMethod.POST })
	public void test(@Valid ApprovalForm form) {
	}
	
	public class ApprovalForm implements Serializable {
		@NotEmpty
		private List<Integer> idList;
	}

5.统一异常拦截处理


import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ValidationException;

import org.slf4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindException;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;

import cn.deepfashion.common.domain.response.ErrorResponse;
import cn.deepfashion.common.enums.ErrorCodeEnum;
import cn.deepfashion.controller.BaseController;
import cn.deepfashion.manager.logger.DeepFashionLoggerFactory;


/*****************************************************
 * 业务异常
 * 
 * @author sjw
 *
 */
@ControllerAdvice
@Component
public class ExceptionController extends BaseController {

	private final Logger logger = DeepFashionLoggerFactory.getLogger(ExceptionController.class);

	@Bean
	public MethodValidationPostProcessor methodValidationPostProcessor() {
		return new MethodValidationPostProcessor();
	}

	/**
	 * 非法参数验证统一处理
	 * 
	 * @author zmh
	 * @param exception
	 * @param request
	 * @param response
	 * @return 2017年4月28日
	 */
	@ExceptionHandler(value = { ValidationException.class, BindException.class })
	public ModelAndView handleValidationException(Exception exception, HttpServletRequest request,
			HttpServletResponse response) {
		logger.warn("handleValidationException::illegal param,servletPath={}, param={}", request.getServletPath(),
				JSON.toJSONString(request.getParameterMap()));
		if (isAjax(request)) {
			ErrorResponse<Object> errorResponse = new ErrorResponse<>(ErrorCodeEnum.P01);


			try {
				if (!response.isCommitted()) {
					response.reset();
					response.setContentType("application/json");
					response.setCharacterEncoding("UTF-8");


					response.getWriter().write(JSON.toJSONString(errorResponse));
				}
			} catch (IOException e) {
				logger.warn("handleValidationException return ajax exception ret ex: ", e);
			}


			return null;
		} else {
			ModelAndView mav = new ModelAndView("error");
			return mav;
		}
	}


	public boolean isAjax(HttpServletRequest request) {
		String header = request.getHeader("x-requested-with");
		if (header == null) {
			return false;
		}
		return "xmlhttprequest".equalsIgnoreCase(header);
	}
}


























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值