原文: https://howtodoinjava.com/spring-boot/custom-property-editor-example/

PropertyEditor最初是 JavaBeans 规范的一部分。 Spring 还大量使用PropertyEditor来以与对象本身不同的方式表示属性,例如从 http 请求参数解析人类可读的输入,或在视图层中显示纯 Java 对象的人类可读的值。

Spring 在org.springframework.beans.propertyeditors包中有许多内置的PropertyEditor,例如用于BooleanCurrencyURL。 这些编辑器中的某些默认情况下已注册,而某些则在需要时需要注册。

您还可以创建自定义的PropertyEditor,以防万一 – 默认属性编辑器无用。 假设我们正在创建一个用于图书管理的应用程序。 现在,人们也可以通过 ISBN 搜索图书。 另外,您将需要在网页中显示 ISBN 详细信息。

创建自定义PropertyEditor

要创建自定义属性编辑器,您将需要扩展java.beans.PropertyEditorSupport类。

IsbnEditor.java

  1. package com.howtodoinjava.app.editors;
  2. import java.beans.PropertyEditorSupport;
  3. import org.springframework.util.StringUtils;
  4. import com.howtodoinjava.app.model.Isbn;
  5. public class IsbnEditor extends PropertyEditorSupport {
  6. @Override
  7. public void setAsText(String text) throws IllegalArgumentException {
  8. if (StringUtils.hasText(text)) {
  9. setValue(new Isbn(text.trim()));
  10. } else {
  11. setValue(null);
  12. }
  13. }
  14. @Override
  15. public String getAsText() {
  16. Isbn isbn = (Isbn) getValue();
  17. if (isbn != null) {
  18. return isbn.getIsbn();
  19. } else {
  20. return "";
  21. }
  22. }
  23. }

Isbn 类别如下:

Isbn.java

  1. package com.howtodoinjava.app.model;
  2. public class Isbn {
  3. private String isbn;
  4. public Isbn(String isbn) {
  5. this.isbn = isbn;
  6. }
  7. public String getIsbn() {
  8. return isbn;
  9. }
  10. public String getDisplayValue() {
  11. return isbn;
  12. }
  13. }

注册自定义PropertyEditor

下一步是在 spring 应用程序中注册自定义属性编辑器。 要注册,您将需要创建一个带有注解的方法 – @InitBinder。 在应用程序启动时,将扫描此注解,并且所有检测到的方法均应具有接受WebDataBinder作为参数的签名。

永远记住,PropertyEditor不是线程安全的。 您应该始终为每个Web请求创建一个新的自定义编辑器实例,并将其注册到WebDataBinder

HomeController.java

  1. @Controller
  2. public class HomeController {
  3. //...
  4. @InitBinder
  5. public void initBinder(WebDataBinder binder) {
  6. binder.registerCustomEditor(Isbn.class, new IsbnEditor());
  7. }
  8. }

使用自定义属性编辑器接受输入并显示值

现在,创建并注册自定义属性编辑器后,就可以使用它。 您可以在控制器中使用它来接受输入,如下所示:

HomeController.java

  1. @Controller
  2. public class HomeController {
  3. private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
  4. @RequestMapping(value = "/books/{isbn}", method = RequestMethod.GET)
  5. public String getBook(@PathVariable Isbn isbn, Map<String, Object> model)
  6. {
  7. LOGGER.info("You searched for book with ISBN :: " + isbn.getIsbn());
  8. model.put("isbn", isbn);
  9. return "index";
  10. }
  11. @InitBinder
  12. public void initBinder(WebDataBinder binder) {
  13. binder.registerCustomEditor(Isbn.class, new IsbnEditor());
  14. }
  15. }

只是看看我们如何不直接在@PathVariable Isbn isbn变量中接受 ISBN 值。 我们的IsbnEditor非常简单,但是您可以在那里拥有完整的规则和验证,并且可以使用。

要显示提供的值,不需要特殊的方法。 只是普通的旧 Spring 方式。

index.jsp

  1. <!DOCTYPE html>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <html lang="en">
  4. <body>
  5. <h2>ISBN You searched is :: ${ isbn.displayValue }</h2>
  6. </body>
  7. </html>

示例

现在,通过运行 spring boot 应用程序来测试应用程序。

SpringBootWebApplication.java

  1. package com.howtodoinjava.app.controller;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.web.support.SpringBootServletInitializer;
  5. @SpringBootApplication
  6. public class SpringBootWebApplication extends SpringBootServletInitializer {
  7. public static void main(String[] args) throws Exception {
  8. SpringApplication.run(SpringBootWebApplication.class, args);
  9. }
  10. }

现在,使用以下网址访问浏览器:http://localhost:8080/books/978-3-16-148410-0

验证服务器中的日志,并在浏览器中显示为 isbn 作为请求输入正确接收的路径参数。

  1. 2017-03-16 13:40:00 - You searched for book with ISBN :: 978-3-16-148410-0

Spring Boot – 自定义`PropertyEditor`配置示例 - 图1

Spring 自定义属性编辑器示例

将我的问题放在评论部分。

学习愉快!