(Portal 开发读书笔记)Spring 校验

简介:

 Spring有校验框架可以用来校验参数,模型的属性

如果不用注解的方式,那么典型的校验,应该是在方法体内创建一个Validator的实例,然后让它来校验某参数,如下所示:

 
 
  1. @ActionMapping(params="action=doSomething"
  2. public void doSomething(@ModelAttribute SomeObject someObject, 
  3. BindingResult bindingResult) { 
  4. Validator validator = new SomeValidator(); 
  5. validator.validate(someObject, bindingResult); 
  6. if(!bindingResult.hasErrors()) { 
  7. ... 
  8. else { 
  9. ... 

-----

如果用注解的方式,那么只要在方法参数前面加上@Valid就可以

 
 
  1. @ActionMapping(params="myaction=addBook"
  2. public void addBook( 
  3. @Valid @ModelAttribute(value="book")Book book, 
  4. BindingResult bindingResult,...) { 
  5. if(!bindingResult.hasErrors()) { 
  6. bookService.addBook(book); 
  7. response.setRenderParameter("myaction""books"); 
  8. sessionStatus.setComplete(); 
  9. else { 
  10. response.setRenderParameter("myaction""addBook"); 

注意,如果使用@Valid,则必须声明校验器并且进行于请求参数绑定,绑定方法有两种,一种是xml配置,一种是用@InitBinder声明,两种的本质都是用于绑定校验器对象到webBindingInitilizer对象中

如果用xml的方式,那么配置如下:(使用场合:一个校验器适用于所有的控制器

 
 
  1. <beans...> 
  2. ... 
  3. <bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter"
  4. <property name="webBindingInitializer"
  5. <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"
  6. <property name="validator" ref="myValidator" /> 
  7. </bean> 
  8. </bean> 
  9. <bean id="myValidator" class="..." /> 
  10. ... 
  11. </beans> 

如果用@InitBinder ,那么代码如下:(使用场合:一个校验器只适用于一个控制器

 
 
  1. public class SomeController { 
  2. ... 
  3. @Autowired 
  4. @Qualifier("myValidator"
  5. private Validator myValidator; 
  6. ... 
  7. @InitBinder("someObject"
  8. public void initBinder(WebDataBinder binder) { 
  9. binder.setValidator(myValidator); 
  10. ... 

 

----

定义校验逻辑:

光会在代码中为字段配置其使用的校验器还远远不够,因为校验器的校验逻辑还需要我们程序员自己去定制:

定制校验逻辑也有两种方法:

方法1: 自定义校验器类让其实现Validator接口并且实现supports和validate方法,这种方式很直观,因为要校验domain对象,所以我定义这个domain对象的校验逻辑

 
 
  1. public class AddBookValidator implements Validator { 
  2. @Autowired 
  3. @Qualifier("myBookService"
  4. private BookService bookService; 
  5. public boolean supports(Class<?> klass) { 
  6. return Book.class.isAssignableFrom(klass); 
  7. public void validate(Object target, Errors errors) { 
  8. Book book = (Book)target; 
  9. ValidationUtils.rejectIfEmptyOrWhitespace(errors, 
  10. "name""name.field.required"); 
  11. ValidationUtils.rejectIfEmptyOrWhitespace(errors, 
  12. "author""author.field.required"); 
  13. String name = book.getName(); 
  14. if(name.length() >10 || name.length() < 3) { 
  15. errors.reject("name""name.field.max.min.size"); 
  16. if(bookService.isUnique(book.getIsbnNumber())) { 
  17. errors.reject("isbnNumber""isbnNumber.field.unique.constraint"); 

方法2: 直接在领域对象本身中用某些注解来定制校验规则:

 
 
  1. public class Book { 
  2. @NotEmpty 
  3. @Size(max=100, min=10
  4. private String name; 
  5. @NotEmpty 
  6. private String author; 
  7. @Unique 
  8. private Long isbnNumber; 
  9. public Book(String name, String author, long isbnNumber) { 
  10. this.name = name; 
  11. this.author = author; 
  12. this.isbnNumber = isbnNumber; 
  13. ... 

----

如何在Spring中启用校验框架?

只要在Spring配置文件中指定其类的实例为LocalValidatorFactoryBean,你还可以为他指定国际化资源来显示校验结果:

 
 
  1. <!-- Validation --> 
  2.     <bean id="validator" 
  3.         class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
  4.         <property name="validationMessageSource" ref="messageSource" /> 
  5.     </bean> 

 





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/845893,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
9天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
21 2
|
29天前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
14天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
28 0
|
2月前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
2214 15
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
26 1
|
1月前
|
开发框架 Java API
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
56 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
47 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
80 0
|
1月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
53 0

热门文章

最新文章

下一篇
无影云桌面