Spring Boot定制type Formatters实例详解
前面我们有篇文章介绍了PropertyEditors,是用来将文本类型转换成指定的Java类型,不过,考虑到PropertyEditor的无状态和非线程安全特性,Spring3增加了一个Formatter接口来替代它。Formatters提供和PropertyEditor类似的功能,但是提供线程安全特性,也可以实现字符串和对象类型的互相转换。
假设在我们的程序中,需要根据一本书的ISBN字符串得到对应的book对象。通过这个类型格式化工具,我们可以在控制器的方法签名中定义Book参数,而URL参数只需要包含ISBN号和数据库ID。
实战
- 首先在项目根目录下创建formatters包
- 然后创建BookFormatter,它实现了Formatter接口,实现两个函数:parse用于将字符串ISBN转换成book对象;print用于将book对象转换成该book对应的ISBN字符串。
packagecom.test.bookpub.formatters; importcom.test.bookpub.domain.Book; importcom.test.bookpub.repository.BookRepository; importorg.springframework.format.Formatter; importjava.text.ParseException; importjava.util.Locale; publicclassBookFormatterimplementsFormatter{ privateBookRepositoryrepository; publicBookFormatter(BookRepositoryrepository){ this.repository=repository; } @Override publicBookparse(StringbookIdentifier,Localelocale)throwsParseException{ Bookbook=repository.findBookByIsbn(bookIdentifier); returnbook!=null?book:repository.findOne(Long.valueOf(bookIdentifier)); } @Override publicStringprint(Bookbook,Localelocale){ returnbook.getIsbn(); } }
在WebConfiguration中添加我们定义的formatter,重写(@Override修饰)addFormatter(FormatterRegistryregistry)函数。
@Autowired privateBookRepositorybookRepository; @Override publicvoidaddFormatters(FormatterRegistryregistry){ registry.addFormatter(newBookFormatter(bookRepository)); }
最后,需要在BookController中新加一个函数getReviewers,根据一本书的ISBN号获取该书的审阅人。
@RequestMapping(value="/{isbn}/reviewers",method=RequestMethod.GET) publicListgetReviewers(@PathVariable("isbn")Bookbook){ returnbook.getReviewers(); }
通过mvnspring-boot:run运行程序
通过httpie访问URL——http://localhost:8080/books/9781-1234-1111/reviewers,得到的结果如下:
HTTP/1.1200OK Content-Type:application/json;charset=UTF-8 Date:Tue,08Dec201508:15:31GMT Server:Apache-Coyote/1.1 Transfer-Encoding:chunked []
分析
Formatter工具的目标是提供跟PropertyEditor类似的功能。通过FormatterRegistry将我们自己的formtter注册到系统中,然后Spring会自动完成文本表示的book和book实体对象之间的互相转换。由于Formatter是无状态的,因此不需要为每个请求都执行注册formatter的动作。
使用建议:如果需要通用类型的转换——例如String或Boolean,最好使用PropertyEditor完成,因为这种需求可能不是全局需要的,只是某个Controller的定制功能需求。
我们在WebConfiguration中引入(@Autowired)了BookRepository(需要用它创建BookFormatter实例),Spring给配置文件提供了使用其他bean对象的能力。Spring本身会确保BookRepository先创建,然后在WebConfiguration类的创建过程中引入。
以上就是本次介绍的全部相关知识点内容,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。