在前面的章节中,我们学习了如何去转换来自HTTP的请求和响应数据。这里还有其它的转换,尤其是动态转换参数到多种对象,如String 到 Date或Integer.
当我们在controller中声明映射方法中,Spring允许我们自由地去声明带有对象的标志。我们可以通过使用PropertyEditory接口。PropertyEditor是JDK的默认并且允许转换一个文本值到所给定的类型。它最初的目的是用于Swing/AWT GUI,而之后在Spring中更好地用于转换web的参数。
Spring MVC已经提供大量PropertyEditor接口给大多数的通用类型,如Boolean,Currency,和Class.
2.6.1代码实现
- 我们需要移除在WebConfiguration类的extendMessageConveters方法中的converters.clear()的代码。
- 接下来我们声明一个Isbn对象和IsbnEdior类,当然还有方法initBinder。我们的BookController将会配置IsbnEditor。
public class Isbn { public String getIsbn() { public class IsbnEditor extends PropertyEditorSupport { @InitBinder |
3.我们getBook方法在BookController也会发生改变,为了去接收Isbn对象,如下面的代码。
@RequestMapping(value = "/{isbn}", method = RequestMethod.GET) |
4.最后,启动工程,访问http://localhost:8080/books/978-1-78528-415-1,然而我们不会看任何有效的变化,IsbnEditor的工作是通过{isbn}参数创建一个Isbn类
2.6.2代码说明
Spring自动配置大量默认的编译器,但是对于自定义的类型,我需要声明新有编译器给每一个web请求。这个功能就是我们在方法上加入@InitBinder。这个注释会被发现,和方法的参数WebDataBindder也是一个重要地方。WebDataBinder提供我们的能力去注册许多自定义的编译器。
需要我们注意的是,PropertyEditor不是线程安全的。由于这个原因,我们需要创建新的自定义编译器给每一个web的请求和使用WebDataBinder注册。
在例子中新的PropertyEditor是需要的,它更好地去继承PropertyEditorSuppor和重写需要的方法。