PropertyEditor由于缺乏安全性,所以Spring引入了Formatter接口取代PropertyEditor.Formatters的目的是提供相似的功能,但是完全是线程安全的,和焦点在大量String的对象类型,并转换一个对象到String.

2.7.1代码实现

  1. 首先,我们先创建一个新的包formatters在src/main/java/org/owen/bookpub包路径下。
  2. 接着,我们创建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
private BookRepository bookRepository;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new BookFormatter(bookRepository));
}

 

      4.现在我们创建新有方法在BookController类中。

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

       5.我们还要引入两份类到StartupRunner中,代码如下:

 @Autowired private AuthorRepository authorRepository;
@Autowired private PublisherRepository publisherRepository;

       我们在StartupRunner的run方法中加入以下的代码来初始化我们表:

 Author author = new Author("Alex", "Antonov");
author = authorRepository.save(author);
Publisher publisher = new Publisher("Packt");
publisher = publisherRepository.save(publisher);
Book book = new Book("978-1-78528-415-1", "Spring Boot Recipes",
author, publisher);
bookRepository.save(book)

 

 

     6.启动我们工程,并访问地址http://localhost:8080/books/978-1-78528-415-1/reviewers,你将会看到:

2.7配置自定义的Formatters

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对象。

相关文章: