Spring Boot实战之定制type Formatters

前面我们有篇文章介绍了PropertyEditors,是用来将文本类型转换成指定的Java类型,不过,考虑到PropertyEditor的无状态和非线程安全特性,Spring 3增加了一个Formatter接口来替代它。Formatters提供和PropertyEditor类似的功能,但是提供线程安全特性,也可以实现字符串和对象类型的互相转换。

假设在我们的程序中,需要根据一本书的ISBN字符串得到对应的book对象。通过这个类型格式化工具,我们可以在控制器的方法签名中定义Book参数,而URL参数只需要包含ISBN号和数据库ID。

实战

首先在项目根目录下创建formatters包

然后创建BookFormatter,它实现了Formatter接口,实现两个函数:parse用于将字符串ISBN转换成book对象;print用于将book对象转换成该book对应的ISBN字符串。

package com.test.bookpub.formatters; import com.test.bookpub.domain.Book; import com.test.bookpub.repository.BookRepository; import org.springframework.format.Formatter; import java.text.ParseException; import java.util.Locale; public class BookFormatter implements Formatter<Book> { private BookRepository repository; public BookFormatter(BookRepository repository) { this.repository = repository; } @Override public Book parse(String bookIdentifier, Locale locale) throws ParseException { Book book = repository.findBookByIsbn(bookIdentifier); return book != null ? book : repository.findOne(Long.valueOf(bookIdentifier)); } @Override public String print(Book book, Locale locale) { return book.getIsbn(); } }

在WebConfiguration中添加我们定义的formatter,重写(@Override修饰)addFormatter(FormatterRegistry registry)函数。

@Autowired private BookRepository bookRepository; @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new BookFormatter(bookRepository)); }

最后,需要在BookController中新加一个函数getReviewers,根据一本书的ISBN号获取该书的审阅人。

@RequestMapping(value = "/{isbn}/reviewers", method = RequestMethod.GET) public List<Reviewer> getReviewers(@PathVariable("isbn") Book book) { return book.getReviewers(); }

通过mvn spring-boot:run运行程序

通过httpie访问URL——:8080/books/9781-1234-1111/reviewers,得到的结果如下:

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Date: Tue, 08 Dec 2015 08:15:31 GMT 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类的创建过程中引入。

Spring Boot 1.x系列

Spring Boot的自动配置、Command-line-Runner

了解Spring Boot的自动配置

Spring Boot的@PropertySource注解在整合Redis中的使用

Spring Boot项目中如何定制HTTP消息转换器

Spring Boot整合Mongodb提供Restful接口

Spring中bean的scope

Spring Boot项目中使用事件派发器模式

Spring Boot提供RESTful接口时的错误处理实践

Spring Boot实战之定制自己的starter

Spring Boot项目如何同时支持HTTP和HTTPS协议

自定义的Spring Boot starter如何设置自动配置注解

Spring Boot项目中使用Mockito

在Spring Boot项目中使用Spock测试框架

Spring Boot项目中如何定制拦截器

Spring Boot项目中如何定制PropertyEditors

Spring Boot构建的Web项目如何在服务端校验表单输入

Spring Boot应用的健康监控

Spring Boot项目中如何定制servlet-filters

Spring Boot实战之定制URL匹配规则

本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。

javaadu

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywyyz.html