MAVEN项目采用SSM框架
PS:本人纯新手,刚入门,留此博客,主要为今后自己学习或工作中温习,矫正,改进。
1.首先在POM.XML中引入下面两个jar包
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
2.在springmvc的dispatcher-servlet(本人采用的是默认配置)中引入如下配置
<!-- 配置数据校验 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
</bean>
当然也可以如下配置,更加灵活:
<!-- 自定义消息数据源 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename"<span style="font-size:24px;"> value="classpath:messages.properties" </span>/>
<property name="fileEncodings" value="utf-8" />
<property name="cacheSeconds" value="120" />
</bean>
<!-- 配置数据校验 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
其中,message.properties中主要是为在校验参数中引入的${X},进行取值。另外,
<!-- 校验数据注解 -->
<mvc:annotation-driven />
这根据各自业务进行扩展配置
3.写测试表格
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
/**
* Created by Quincy on 2017/9/20.
*/
@Data
public class AppUserForm {
@NotEmpty(message = "姓名必填")
private String userName;
@NotEmpty(message = "手机号必填")
private String phone;
@NotEmpty(message = "公司必填")
private String corporateName;
@NotEmpty(message = "密码必填")
private String password;
@NotEmpty(message = "验证码必填")
private String verificationCode;
}
其中此处注意引入的包是:
org.hibernate.validator.constraints.NotEmpty
千万别引入
import javax.validation.constraints.*
否则会报出以下异常
No validator could be found for type: java.lang.String.
但具体为什么需要导入hibernate.validator 而不是 javax.validator,本人暂时仍未弄清楚,可能跟SpringMVC中配置的validator下的类有关。
4.最后在Controller层进行@Valid注解的使用
/**
* 注册
* */
@RequestMapping(value = "/register",method = RequestMethod.POST)
@ResponseBody
public ServerResponse register(@Valid AppUserForm appUserForm, BindingResult bindingResult){
if (bindingResult.hasErrors()){
log.error("【注册用户】参数不正确,appUserForm = {}", appUserForm);
throw new UserException(ResultEnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());
}
return appUserService.register(appUserForm);
}
而此处@Valid 引入的是
import javax.validation.Valid;
注意@Valid 需要紧跟所检测的对象,另外BindingResult 是必不可少的。
通过后面测试,以上配置成功进行了数据校验。