springmvc使用JSR-303对复杂对象进行校验
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。此实现与Hibernate ORM 没有任何关系。JSR 303 用于对Java Bean 中的字段的值进行验证。
1.配置Maven
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
2.编写需要校验的bean
public class QuestionnaireDetailDto {
/**问卷id*/
private BigInteger key;
/**问卷标题*/
@NotBlank(message = "请输入问卷标题")
private String title;
/**问卷备注*/
@NotBlank(message = "请输入问卷备注")
private String note;
/**问卷对应的策略*/
private List<BigInteger> strategys = Lists.newArrayList();
/**题目list*/
@Size(min = 1, max = 10, message = "可输入1-10个题目")
private List<QuestionDto> questions = Lists.newArrayList();
//省略get,set,toString方法
}
3.校验
@ResponseBody
@RequestMapping(value = "/add", method = RequestMethod.POST)
public Object addQuestionnaire(@Validated @RequestBody QuestionnaireDetailDto questionnaireDetailDto, BindingResult bindingResult) {
validQuestionnaireDetailDto(bindingResult);
if (questionnaireService.addQuestionnaire(questionnaireDetailDto)) {
LOGGER.info("添加问卷成功");
return JsonResult.getSuccessMessage("添加问卷成功");
} else {
LOGGER.error("添加问卷失败");
return JsonResult.getErrorMessage("添加问卷失败");
}
}
valid方法和validQuestionnaireDetailDto方法:
@Autowired
protected Validator validator; protected void validData(BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
StringBuffer sb = new StringBuffer();
for (ObjectError error : bindingResult.getAllErrors()) {
sb.append(error.getDefaultMessage());
}
throw new DataException(sb.toString());
}
} /**
* 对QuestionnaireDetailDto参数校验
*
* @param bindingResult bindingResult
*/
protected void validQuestionnaireDetailDto(BindingResult bindingResult) {
validData(bindingResult); //如果bindingResult中有List<pojo>,只通过bindingResult.hasErrors是检测不到pojo中的异常的
//针对这种情况,先取到List<pojo>对象,再进行验证
Object object = bindingResult.getModel().get(bindingResult.getObjectName()); QuestionnaireDetailDto questionnaireDetailDto = (QuestionnaireDetailDto) object;
List<QuestionDto> questionDtos = questionnaireDetailDto.getQuestions(); for (QuestionDto questionDto : questionDtos) {
validateWithException(validator, questionDto);
//拿到questionDto中的options属性(类型为List<ChoiceDto>)
List<ChoiceDto> choiceDtos = questionDto.getOptions();
for (ChoiceDto choiceDto : choiceDtos) {
validateWithException(validator, choiceDto);
}
}
} /**
* 服务端参数有效性验证
*
* @param object 验证的实体对象
* @param groups 验证组
* @return 验证成功:返回true;验证失败:将错误信息添加到message中
*/
@SuppressWarnings("rawtypes")
protected static void validateWithException(Validator validator, Object object, Class<?>... groups) {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
if (!constraintViolations.isEmpty()) {
StringBuffer sb = new StringBuffer();
for (ConstraintViolation constraintViolation : constraintViolations) {
sb.append(constraintViolation.getMessage());
}
throw new DataException(sb.toString());
}
}
需要注意的是:如果仅仅调用validData方法,校验不到QuestionnaireDetailDto中QuestionDto的属性,所以重写了一个validQuestionnaireDetailDto。
此时需要多引入两个依赖:
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>el-impl</groupId>
<artifactId>el-impl</artifactId>
<version>1.0</version>
</dependency>
springmvc使用JSR-303对复杂对象进行校验的更多相关文章
- Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化
导包和配置 导入 JSR 303 的包.hibernate valid 的包 <dependency> <groupId>org.hibernate.validator< ...
- SpringMVC中实现Bean Validation(JSR 303 JSR 349 JSR 380)
JSR 303是针对bean数据校验提出的一个规范.使用注解方式实现数据校验. 每个注解的用法这里就不多介绍,请移步JSR 303 - Bean Validation 介绍及最佳实践 笔者上面提到的J ...
- SpringMVC中的 JSR 303 数据校验框架说明
JSR 303 是java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE 6.0中. JSR 303 通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则 ...
- JSR 303 - Bean Validation 简单介绍及用法
一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...
- JSR 303 进行后台数据校验
一.JSR 303 1.什么是 JSR 303? JSR 是 Java Specification Requests 的缩写,即 Java 规范提案. 存在各种各样的 JSR,简单的理解为 JSR 是 ...
- JSR 303标准
JSR 303是Java为bean数据合法性校验提供的标准框架,JSR 303通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则,并通过标准的校验接口对bean进行验证. ...
- JSR 303 - Bean Validation 介绍及最佳实践
JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...
- JSR教程1——JSR 303 - Bean Validation介绍
1.Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在通常的情况下, ...
- JSR 303 - Bean Validation 介绍及最佳实践(转)
JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个 ...
随机推荐
- Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)
简介 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现.MultiAction是多点触控的类,可以模拟用户多点操作.主要包含加载add( ...
- java8(一)Lambda表达式
其实很久前已经学习过了Lambda表达式,但是学习后没有多少使用的机会,久而久之也就忘记(惭愧).最近新的项目用的jdk8所以准备再学习一次,写下文章也是为了记录,方便以后再忘的时候,不用到处找资料( ...
- jq css3实现跑马灯+大转盘
前端效果, <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" con ...
- 还在为垂直居中苦恼?CSS 布局利器 flexbox 轻轻松松帮你搞定
传统的 CSS 布局方式是基于盒模型(它是根据盒子与父盒子以及兄弟盒子的关系确定大小和位置的算法),实现时依赖于 block, inline, table, position, float 这些属性, ...
- git:将代码提交到远程仓库(码云)
初始化 进入一个任意的文件夹(如D:\aqin_test1\) git init # 初始化,让git将这个文件夹管理起来 git add . # 收集此文件夹下的所有文件 git config -- ...
- .net软件开发脚本规范-SVN标准
一. SVN标准 1) 提交代码前先获取最新代码 2) 提交时需要填写信息,填写任务Excel中的修改内容列,如以下任务填写“业绩考核-工作量管理”,如果发生修改再次提交,在其后加上修改原因,例“业绩 ...
- vue-cli+v-charts实现移动端可视化图表
v-charts是饿了么团队开源的一款基于Vue和Echarts的图表工具,在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出现正是为了解决这个 ...
- 2019Hexo博客Next主题深度美化 打造一个炫酷博客(2)-奥怪的小栈
219/8/1 更新 本文转载于:奥怪的小栈 这篇文章告诉你在搭建好博客后,面对网上千篇一律的美化教程怎么才能添加自己独特点,使人眼前一亮. 本站基于HEXO+Github搭建. 所以你需要准备好HE ...
- .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
基于上一篇文件“.NET Core 小程序开发零基础系列(1)——开发者启用并校验牵手成功”的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题,后面我也会通过实战 ...
- cogs 80. 石子归并 动态规划
80. 石子归并 ★★ 输入文件:shizi.in 输出文件:shizi.out 简单对比时间限制:1 s 内存限制:128 MB 设有N堆沙(shi)子排成一排,其编号为1,2,3, ...