spring mvc4 hibernate validator 方法参数验证

xiaoxiao2021-02-27  291

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); } }

转载请注明原文地址: https://www.6miu.com/read-5354.html

最新回复(0)