Spring Boot定制type Formatters实例详解

 更新时间:2019年11月10日 09:11:54   作者:javaadu  
在本篇文章里小编给大家整理的是关于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——http://localhost: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类的创建过程中引入。

以上就是本次介绍的全部相关知识点内容,感谢大家的学习和对脚本之家的支持。

相关文章

  • 详解Java泛型中类型擦除问题的解决方法

    详解Java泛型中类型擦除问题的解决方法

    Java泛型的实现是不完整的,有时会遇到一些Java泛型类型擦除的问题。本文将详细为大家讲解Java泛型中类型擦除问题的解决方法,需要的可以参考一下
    2022-05-05
  • Spring Boot 集成Shiro的多realm配置过程

    Spring Boot 集成Shiro的多realm配置过程

    这篇文章主要介绍了Spring Boot 集成Shiro的多realm配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 使用JVMTI实现SpringBoot的jar加密,防止反编译

    使用JVMTI实现SpringBoot的jar加密,防止反编译

    这篇文章主要介绍了使用JVMTI实现SpringBoot的jar加密,防止反编译问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java util concurrent及基本线程原理简介

    Java util concurrent及基本线程原理简介

    这篇文章主要介绍了Java util concurrent及基本线程原理简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • SpringBoot工程打包与运行的实现详解

    SpringBoot工程打包与运行的实现详解

    本文主要介绍了SpringBoot工程的打包与运行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 深入讲解spring boot中servlet的启动过程与原理

    深入讲解spring boot中servlet的启动过程与原理

    这篇文章主要给大家介绍了关于spring boot中servlet启动过程与原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • java实现双色球彩票游戏

    java实现双色球彩票游戏

    这篇文章主要为大家详细介绍了java实现双色球彩票游戏,超级简单的逻辑,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • springboot中使用jpa下hibernate的ddl-auto方式

    springboot中使用jpa下hibernate的ddl-auto方式

    这篇文章主要介绍了springboot中使用jpa下hibernate的ddl-auto方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 浅谈SpringBoot项目如何让前端开发提高效率(小技巧)

    浅谈SpringBoot项目如何让前端开发提高效率(小技巧)

    这篇文章主要介绍了浅谈SpringBoot项目如何让前端开发提高效率(小技巧),主要介绍了Swagger和Nginx提高效率的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • java对象转换String类型的三种方法

    java对象转换String类型的三种方法

    在很多情况下我们都需要将一个对象转换为String类型。一般来说有三种方法可以实现:Object.toString()、(String)Object、String.valueOf(Object)。下面对这三种方法一一分析
    2013-11-11

最新评论