- 浏览: 3513828 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:37477
-
Cordova 3.x入门...
浏览量:604288
-
常用Java开源Libra...
浏览量:678021
-
搭建 CentOS 6 服...
浏览量:87242
-
Spring Boot 入...
浏览量:399799
-
基于Spring Secu...
浏览量:69060
-
MQTT入门
浏览量:90463
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
除过在客户端做JavaScript数据校验外,服务器端做数据校验是很有必要的。Spring提供数据校验,SpringBoot工程里使用没有多大变化。
数据校验分为两种:
(1)单字段校验
Form字段上添加注解
src/main/java/com/rensanning/springboot/web/form/ValidSampleForm.java
Contrller注入参数前添加@Validated
src/main/java/com/rensanning/springboot/web/ValidSampleContrller.java
页面中显示错误信息
src/main/resources/templates/validSample.html
一览显示错误信息
(2)自定义错误信息
Spring默认错误信息
自定义错误信息
Java中自定义
外部自定义
SpringBoot自动读取classpath中的ValidationMessages.properties里的错误信息
src/main/resources/ValidationMessages.properties
统一到国际化信息文件messages.properties
(3)嵌套校验 @Valid
集合Bean校验也和上边一致:
(4)组校验
定义Group
只校验Group1的字段
顺序执行校验
假如以下定义,如果name为空,两个错误提示都会显示到页面上。
只有@NotEmpty不出错的情况下才执行@Length:
(5)多字段校验
实现Spring的Validator
通过@InitBinder添加自定义校验
src/main/resources/messages.properties
一个Controller需要校验多个Form的话:
(6)自定义校验
a - 已有注解基础上自定义
b - 单字段校验
c - 多字段关联校验
(7)同时支持Hibernate Validator 和 Spring Validator
数据校验分为两种:
- 单字段校验(比如:非空、长度、大小等),Java的标准Bean Validation(内部实现是Hibernate Validator)
- 关系多字段校验(比如:时间期间、密码的两次输入等),Spring 的 org.springframework.validation.Validator
(1)单字段校验
Form字段上添加注解
src/main/java/com/rensanning/springboot/web/form/ValidSampleForm.java
public class ValidSampleForm { @NotBlank @Size(max=5) private String name; }
Contrller注入参数前添加@Validated
src/main/java/com/rensanning/springboot/web/ValidSampleContrller.java
@Controller public class ValidSampleContrller { @RequestMapping(value="/validSample", method = RequestMethod.POST) public String postValidSample(@ModelAttribute("form") @Validated ValidSampleForm form, BindingResult result, Model model) { if (result.hasErrors()) { for(FieldError err: result.getFieldErrors()) { log.debug("error code = [" + err.getCode() + "]"); } } return "validSample"; } }
页面中显示错误信息
src/main/resources/templates/validSample.html
<form th:action="@{/validSample}" th:object="${form}" method="post"> <table> <tr> <td>姓名:</td> <td> <input type="text" th:field="*{name}" th:errorclass="fieldError" /> </td> <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}" style="color: red"></td> </tr> </table> </form>
一览显示错误信息
<ul> <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerrMsg : fielderrMsg" th:text="${e.message}" /> </ul>
(2)自定义错误信息
Spring默认错误信息
引用
hibernate-validator-5.3.4.Final.jar\org\hibernate\validator\ValidationMessages.properties
自定义错误信息
Java中自定义
@NotNull(message="不能为空!")
外部自定义
@NotNull(message="{sample.bean_validation.notNull}")
引用
sample.bean_validation.notNull=不能为空!
SpringBoot自动读取classpath中的ValidationMessages.properties里的错误信息
src/main/resources/ValidationMessages.properties
引用
javax.validation.constraints.Pattern.message=
javax.validation.constraints.Size.message=
javax.validation.constraints.Min.message=
org.hibernate.validator.constraints.NotBlank.message=
javax.validation.constraints.Size.message=
javax.validation.constraints.Min.message=
org.hibernate.validator.constraints.NotBlank.message=
统一到国际化信息文件messages.properties
@Bean public LocalValidatorFactoryBean validator() { LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); localValidatorFactoryBean.setValidationMessageSource(messageSource); return localValidatorFactoryBean; } @Override public org.springframework.validation.Validator getValidator() { return validator(); }
(3)嵌套校验 @Valid
public class OrderForm { @NotNull @Valid private AddressForm receiverAddress; @NotNull @Valid private AddressForm senderAddress; } public class AddressForm { @NotNull @Size(min = 1, max = 100) private String address; }
集合Bean校验也和上边一致:
public class OrderForm { @NotNull @Size(min = 1, max = 3) @Valid private List<AddressForm> addresses; }
(4)组校验
定义Group
public class ValidSampleForm { public static interface Group1 {}; public static interface Group2 {}; @NotBlank(groups=Group1.class) @Size(max=5, groups=Group1.class) private String name; @Min(value=0, groups={Group1.class, Group2.class}) private Integer age; @NotBlank(groups=Group2.class) private Date birthday; }
只校验Group1的字段
@RequestMapping(value="/validSample", method = RequestMethod.POST) public String postValidSample(@ModelAttribute("form") @Validated(Group1.class) ValidSampleForm form, BindingResult result, Model model) { if (result.hasErrors()) { for(FieldError err: result.getFieldErrors()) { log.debug("error code = [" + err.getCode() + "]"); } } return "validSample"; }
顺序执行校验
假如以下定义,如果name为空,两个错误提示都会显示到页面上。
@NotEmpty(message = "请输入姓名!") @Length(min = 1, max = 10, message = "1到10位字符") private String name;
只有@NotEmpty不出错的情况下才执行@Length:
public interface First { } public interface Second { } @GroupSequence({First.class, Second.class}) public interface All { }
@NotEmpty(message = "请输入姓名!", groups = First.class) @Length(min = 1, max = 10, message = "1到10位字符", groups = Second.class) private String name;
@RequestMapping(method = RequestMethod.POST) public String indexPost(@ModelAttribute("form") @Validated(All.class) Person p, BindingResult r) { return "index"; }
(5)多字段校验
实现Spring的Validator
@Component public class ValidSampleValidator implements Validator { public boolean supports(Class<?> c) { return ValidSampleForm.class.isAssignableFrom(c); } @Override public void validate(Object paramObject, Errors paramErrors) { if (paramErrors.hasFieldErrors("from") || paramErrors.hasFieldErrors("to")) { return; } ValidSampleForm form = (ValidSampleForm)paramObject; Date from = form.getFrom(); Date to = form.getTo(); if (from != null && to != null && from.compareTo(to) > 0) { paramErrors.rejectValue("from", "validator.Period"); } } }
通过@InitBinder添加自定义校验
@Controller public class ValidSampleController { @Autowired private ValidSampleValidator validSampleValidator; @InitBinder public void initBinder(WebDataBinder binder) { binder.addValidators(validSampleValidator); } @RequestMapping(value="/validSample", method = RequestMethod.POST) public String postValidSample(@ModelAttribute("form") ValidSampleForm form, BindingResult result, Model model) { if (result.hasErrors()) { for(FieldError err: result.getFieldErrors()) { log.debug("error code = [" + err.getCode() + "]"); } } return "validSample"; } }
src/main/resources/messages.properties
引用
validator.Period=
一个Controller需要校验多个Form的话:
@Controller public class XxxController { @ModelAttribute("AaaForm") public AaaForm() { return new AaaForm(); } @ModelAttribute("BbbForm") public BbbForm() { return new BbbForm(); } @InitBinder("AaaForm") public void initBinderForAaa(WebDataBinder binder) { binder.addValidators(aaaValidator); } @InitBinder("BbbForm") public void initBinderForBbb(WebDataBinder binder) { binder.addValidators(bbbValidator); } }
(6)自定义校验
a - 已有注解基础上自定义
@NotBlank @Size(min=1, max=5) public @interface Name { String message() default "{com.rensanning.springboot.validator.constraints.Name.message}"; // ... }
引用
com.rensanning.springboot.validator.constraints.Name.message=xxx
@Name private String name;
b - 单字段校验
public class AgeValidator implements ConstraintValidator<Age, Integer> { int min; int max; @Override public void initialize(Age annotation) { min = annotation.min(); max = annotation.max(); } @Override public boolean isValid(Integer value, ConstraintValidatorContext paramConstraintValidatorContext) { if (value == null) { return true; } if (value < min || value > max) { return false; } return true; } } @Constraint(validatedBy={AgeValidator.class}) public @interface Age { String message() default "{com.rensanning.springboot.validator.constraints.Age.message}"; int min() default 0; int max() default 100; }
引用
com.rensanning.springboot.validator.constraints.Age.message=
@Age(min=18) private Integer age;
c - 多字段关联校验
@Constraint(validatedBy={PeriodValidator.class}) public @interface Period { String message() default "{com.rensanning.springboot.validator.constraints.Period.message}"; String fieldFrom() default "from"; String fieldTo() default "to"; }
引用
com.rensanning.springboot.validator.constraints.Period.message=
public class PeriodValidator implements ConstraintValidator<Period, Object> { private String fieldFrom; private String fieldTo; private String message; @Override public void initialize(Period annotation) { this.fieldFrom = annotation.fieldFrom(); this.fieldTo = annotation.fieldTo(); this.message = annotation.message(); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { BeanWrapper beanWrapper = new BeanWrapperImpl(value); Date from = (Date)beanWrapper.getPropertyValue(fieldFrom); Date to = (Date)beanWrapper.getPropertyValue(fieldTo); if (from != null && to != null && from.compareTo(to) > 0) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate(message) .addNode(fieldFrom) .addConstraintViolation(); return false; } return true; } }
@Period(fieldFrom="from", fieldTo="to") public class ValidSampleForm { private Date from; private Date to; }
(7)同时支持Hibernate Validator 和 Spring Validator
@Controller public class UserController { @Autowired private UserFormValidator userFormValidator; @RequestMapping(value = "/save", method = RequestMethod.POST) public String save(@ModelAttribute("userForm") @Valid User user, BindingResult result, Model model) { // 手动执行Spring Validator userFormValidator.validate(user, result); if (result.hasErrors()) { //... } else { //... } } }
发表评论
-
Spring Boot 入门 - 进阶篇(8)- 应用监控(Actuator)
2017-03-16 14:57 17504作为Spring Boot的另外一大亮点,就是actuator ... -
Spring Boot 入门 - 进阶篇(7)- 自动配置(AutoConfigure)
2017-03-16 11:05 62140自动配置是Spring Boot的最大亮点,完美的展示了CoC ... -
Spring Boot 入门 - 进阶篇(6)- 启动加载(CommandLineRunner)
2017-03-15 15:04 14975启动成功后可以通过以下方法运行自己的初始代码: @PostCo ... -
Spring Boot 入门 - 进阶篇(5)- 数据缓存(@Cacheable)
2017-03-14 16:28 34566缓存可以缓解数据库访 ... -
Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)
2017-03-14 11:07 45170经常需要发送一个GET/POST请求到其他系统(REST AP ... -
Spring Boot 入门 - 进阶篇(3)- 定时任务(@Scheduled)
2017-03-13 13:23 23652主要用于定时发送邮件、夜间自动维护等。 (1)开启定时任务功 ... -
Spring Boot 入门 - 进阶篇(2)- 异步调用(@Async)
2017-03-07 15:59 20003异步处理 Java的异步处理Thread/Runnable、 ... -
Spring Boot 入门 - 进阶篇(1)- Servlet、Filter、Listener、Interceptor
2017-03-07 10:39 10546用户认证授权、日志记录MDC、编码解码、UA检查、多端对应等都 ... -
Spring Boot 入门 - 基础篇(15)- 工程部署
2017-02-16 15:31 8992(1)开发阶段 一般开发过程: 1)-写代码 2)- [Ru ... -
Spring Boot 入门 - 基础篇(14)- 参数设置
2017-02-16 15:25 5679(1)读取优先顺序 a - 命令行参数 --key=val ... -
Spring Boot 入门 - 基础篇(13)- 异常处理
2017-02-16 10:23 8605先要了解Spring的异常处理:http://rensanni ... -
Spring Boot 入门 - 基础篇(11)- 数据源配置
2017-02-15 11:12 16317(1)单一数据源 默认Spring Boot会在classp ... -
Spring Boot 入门 - 基础篇(10)- 发送邮件
2017-02-14 10:04 2427(1)配置 pom.xml <dependency> ... -
Spring Boot 入门 - 基础篇(9)- 文件上传下载
2017-02-14 10:01 15790(1)单文件上传 Form方式 <form id=&qu ... -
Spring Boot 入门 - 基础篇(8)- 数据库操作
2017-02-10 16:17 8605(1)导入mybatis-spring-boot-starte ... -
Spring Boot 入门 - 基础篇(7)- 国际化
2017-02-10 13:58 13074Spring Boot默认支持国际化配置,只需要添加配置文件即 ... -
Spring Boot 入门 - 基础篇(6)- 页面模板
2017-02-09 15:00 6395Spring Boot支持很多模板引擎,但嵌入式容器JSP有限 ... -
Spring Boot 入门 - 基础篇(5)- 使用WebJars
2017-02-09 14:20 11660WebJars能使Maven的依赖管理支持OSS的JavaSc ... -
Spring Boot 入门 - 基础篇(4)- 静态资源
2017-02-09 13:10 10647静态资源包括:HTML、CSS、JS、图像、视频、PDF/Of ... -
Spring Boot 入门 - 基础篇(3)- 日志管理
2017-02-09 09:39 8421Spring Boot支持JUL,Log4J2和Logback ...
相关推荐
赠送jar包:spring-boot-actuator-autoconfigure-2.3.12.RELEASE.jar; 赠送原API文档:spring-boot-actuator-autoconfigure-2.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-boot-actuator-autoconfigure-2.3.12....
赠送jar包:seata-spring-boot-starter-1.3.0.jar; 赠送原API文档:seata-spring-boot-starter-1.3.0-javadoc.jar; 赠送源代码:seata-spring-boot-starter-1.3.0-sources.jar; 赠送Maven依赖信息文件:seata-...
赠送jar包:spring-boot-configuration-processor-2.6.3.jar; 赠送原API文档:spring-boot-configuration-processor-2.6.3-javadoc.jar; 赠送源代码:spring-boot-configuration-processor-2.6.3-sources.jar; ...
赠送jar包:spring-boot-configuration-processor-2.3.12.RELEASE.jar; 赠送原API文档:spring-boot-configuration-processor-2.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-boot-configuration-processor-...
赠送jar包:druid-spring-boot-starter-1.1.9.jar; 赠送原API文档:druid-spring-boot-starter-1.1.9-javadoc.jar; 赠送源代码:druid-spring-boot-starter-1.1.9-sources.jar; 赠送Maven依赖信息文件:druid-...
赠送jar包:mybatis-spring-boot-autoconfigure-1.3.2.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-1.3.2-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-1.3.2-sources.jar; 赠送...
赠送jar包:spring-boot-configuration-processor-2.5.6.jar; 赠送原API文档:spring-boot-configuration-processor-2.5.6-javadoc.jar; 赠送源代码:spring-boot-configuration-processor-2.5.6-sources.jar; ...
赠送jar包:spring-boot-autoconfigure-2.3.12.RELEASE.jar; 赠送原API文档:spring-boot-autoconfigure-2.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-boot-autoconfigure-2.3.12.RELEASE-sources.jar; 赠送...
赠送jar包:druid-spring-boot-starter-1.1.10.jar; 赠送原API文档:druid-spring-boot-starter-1.1.10-javadoc.jar; 赠送源代码:druid-spring-boot-starter-1.1.10-sources.jar; 赠送Maven依赖信息文件:druid-...
赠送jar包:aliyun-sms-spring-boot-starter-2.0.2.jar 赠送原API文档:aliyun-sms-spring-boot-starter-2.0.2-javadoc.jar 赠送源代码:aliyun-sms-spring-boot-starter-2.0.2-sources.jar 包含翻译后的API文档...
赠送jar包:oss-spring-boot-starter-1.0.3.jar; 赠送原API文档:oss-spring-boot-starter-1.0.3-javadoc.jar; 赠送源代码:oss-spring-boot-starter-1.0.3-sources.jar; 赠送Maven依赖信息文件:oss-spring-boot...
赠送jar包:nacos-config-spring-boot-autoconfigure-0.2.7.jar; 赠送原API文档:nacos-config-spring-boot-autoconfigure-0.2.7-javadoc.jar; 赠送源代码:nacos-config-spring-boot-autoconfigure-0.2.7-sources...
赠送jar包:dynamic-datasource-spring-boot-starter-3.4.1.jar; 赠送原API文档:dynamic-datasource-spring-boot-starter-3.4.1-javadoc.jar; 赠送源代码:dynamic-datasource-spring-boot-starter-3.4.1-sources...
赠送jar包:dynamic-datasource-spring-boot-starter-3.4.1.jar; 赠送原API文档:dynamic-datasource-spring-boot-starter-3.4.1-javadoc.jar; 赠送源代码:dynamic-datasource-spring-boot-starter-3.4.1-sources...
赠送jar包:druid-spring-boot-starter-1.2.8.jar; 赠送原API文档:druid-spring-boot-starter-1.2.8-javadoc.jar; 赠送源代码:druid-spring-boot-starter-1.2.8-sources.jar; 赠送Maven依赖信息文件:druid-...
赠送jar包:spring-boot-admin-server-ui-2.5.2.jar; 赠送原API文档:spring-boot-admin-server-ui-2.5.2-javadoc.jar; 赠送源代码:spring-boot-admin-server-ui-2.5.2-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:druid-spring-boot-starter-1.1.9.jar; 赠送原API文档:druid-spring-boot-starter-1.1.9-javadoc.jar; 赠送源代码:druid-spring-boot-starter-1.1.9-sources.jar; 赠送Maven依赖信息文件:druid-...
赠送jar包:oss-spring-boot-starter-1.0.3.jar 赠送原API文档:oss-spring-boot-starter-1.0.3-javadoc.jar 赠送源代码:oss-spring-boot-starter-1.0.3-sources.jar 包含翻译后的API文档:oss-spring-boot-...
mybatis-spring-boot-starter-2.1.3.jarmybatis-spring-boot-starter-2.1.3.jarmybatis-spring-boot-starter-2.1.3.jar
spring-boot项目pom.xm中parent依赖文件spring-boot-starter-parent-1.5.13.RELEASE.pom