PropertyEditor由于缺乏安全性,所以Spring引入了Formatter接口取代PropertyEditor.Formatters的目的是提供相似的功能,但是完全是线程安全的,和焦点在大量String的对象类型,并转换一个对象到String.
2.7.1代码实现
- 首先,我们先创建一个新的包formatters在src/main/java/org/owen/bookpub包路径下。
- 接着,我们创建BookFormatter类并实现Formatter接口。
|
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 ; }
@Override public String print(Book book, Locale locale) { return book.getIsbn(); }
} |
3.现在我们需要重写addFormatters(FormatterRegistry registry)的方法在WebConfiguration类中。
|
@Autowired |
4.现在我们创建新有方法在BookController类中。
|
@RequestMapping(value = "/{isbn}/reviewers", method = |
5.我们还要引入两份类到StartupRunner中,代码如下:
|
@Autowired private AuthorRepository authorRepository; |
我们在StartupRunner的run方法中加入以下的代码来初始化我们表:
|
Author author = new Author("Alex", "Antonov"); |
6.启动我们工程,并访问地址http://localhost:8080/books/978-1-78528-415-1/reviewers,你将会看到:
2.7.2代码说明
这个Formatter功能跟PropertyEfitor是相似的。通过注册我们的FormatterRegistry在addFormatters方法中,我们的Spring会将我们的Formmatter转换文本到指定的对象。在我们每次请求时,我们不需要去关注对象的转换问题,Spring会帮你做这些事情。
如果你要想去转换普通的类型,像String或Boolean类型,你需要像我们在IsbnEditor例子那样做。它更好地通过PropertyEditors在Controller的InitBinder中初始化,像这样的可能不是全局的,和它仅仅是Controller功能的一部分。
你可能意识到我们自动装配了BookRepository在我们的WebConfiguration类,这里需要我们去创建BookFormatter.而Spring会结合配置类和所依赖的bean。也就是说当我们调用WebConfiguration类时,Spring首先先创建是BookRepository对象。