前言

PropertyEditor最初是属于Java Bean规范定义的,有意思的是,Spring也大规模的使用了PropertyEditors,以便实现以各种形式展现对象的属性;

举个例子,常见的用于解析Http请求参数,通常需要在展现层把原始Java对象解析成对人友好的参数,这时候就经常需要用到自定义PropertyEditor

org.springframework.beans.propertyeditors 包下,Spring已经内置了一些PropertyEditors,如解析Boolean, Currency, 和URL对象;然而这只是其中一部分常见的editors,在真实项目开发过程中,往往不满足我们的业务需求;

当默认的这些PropertyEditors不满足我们的需求的时候,我们需要自定义PropertyEditor,举个例子,假如我们要开发一个图书管理的应用,实现可以通过 ISBN去搜索图书,同样,图书详情里也需要展示ISBN信息,这里我们可以通过自定义PropertyEditor实现,详细开发过程如下:

创建自定义PropertyEditor

我们需要继承java.beans.PropertyEditorSupport 类来实现自定义PropertyEditor,如下所示:

IsbnEditor.java

package com.howtodoinjava.app.editors;

import java.beans.PropertyEditorSupport;
import org.springframework.util.StringUtils;
import com.howtodoinjava.app.model.Isbn; public class IsbnEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (StringUtils.hasText(text)) {
setValue(new Isbn(text.trim()));
} else {
setValue(null);
}
} @Override
public String getAsText() {
Isbn isbn = (Isbn) getValue();
if (isbn != null) {
return isbn.getIsbn();
} else {
return "";
}
}
}

其中Isbn 类如下:

Isbn.java

package com.howtodoinjava.app.model;

public class Isbn {
private String isbn; public Isbn(String isbn) {
this.isbn = isbn;
} public String getIsbn() {
return isbn;
} public String getDisplayValue() {
return isbn;
}
}

注册自定义PropertyEditor

下一步需要在Spring应用中注册我们刚刚编写的自定义PropertyEditor

注册很简单,只需要创建一个带@InitBinder注解的方法,其中该方法需要接收一个WebDataBinder类型的参数;

注意事项:

PropertyEditors并不是线程安全的,对于每一个请求,我们都需要new一个PropertyEditor对象,并用WebDataBinder去注册;

HomeController.java

@Controller
public class HomeController { //... @InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Isbn.class, new IsbnEditor());
}
}

通过自定义PropertyEditor接收参数并展现

当我们创建完自定义PropertyEditor并注册后,就可以在Controller里使用它了,

HomeController.java

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

现在我们就可以直接通过@PathVariable Isbn isbn去接收isbn参数了,目前我们的IsbnEditor非常简单,但是我们可以在这个基础上添加很多校验规则,非常简便;

接下来,我们可以编写一个jsp文件,去展示信息:

index.jsp

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

Demo测试

直接运行Spring Boot应用即可;

SpringBootWebApplication.java

package com.howtodoinjava.app.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication
public class SpringBootWebApplication extends SpringBootServletInitializer { public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootWebApplication.class, args);
}
}

在浏览器中输入http://localhost:8080/books/978-3-16-148410-0 地址测试;

观察后台日志打印及前端展现:

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

Spring Boot – 自定义PropertyEditor的更多相关文章

  1. spring boot自定义线程池以及异步处理

    spring boot自定义线程池以及异步处理@Async:什么是线程池?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使 ...

  2. Spring Boot自定义配置与加载

    Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...

  3. Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置

    0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...

  4. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

  5. 玩转Spring Boot 自定义配置、导入XML配置与外部化配置

    玩转Spring Boot 自定义配置.导入XML配置与外部化配置       在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...

  6. 峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06  峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...

  7. Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践

    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...

  8. Spring Boot自定义starter必知必会条件

    前言 在目前的Spring Boot框架中,不管是Spring Boot官方还是非官方,都提供了非常多的starter系列组件,助力开发者在企业应用中的开发,提升研发人员的工作效率,Spring Bo ...

  9. Spring Boot自定义错误页面,Whitelabel Error Page处理方式

    我已经是Spring Framework框架的忠实粉丝.对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题.但是,它构建的J2EE项目变得比较臃肿,需要被一 ...

随机推荐

  1. [C#.Net]Window服务调用外部程序

    最近遇到要做回传服务内增加开关,可以自定义运行一些脚本已方便收集PC状态,发现Bat始终无法运行,上网找了半天才发现和Session0有关,也就是程序有不同级别的访问权限,Vista以上版本为了安全因 ...

  2. LD的-rpath,-rpath-link

    http://blog.chinaunix.net/uid-24709751-id-3563351.html http://songzhangzhang.blog.163.com/blog/stati ...

  3. Codeforces Round #539 (Div. 2) C Sasha and a Bit of Relax

    题中意思显而易见,即求满足al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar且l到r的区间长为偶数的这样的数对(l,r)的个数. 若al⊕al+1⊕…⊕amid=amid+1⊕amid ...

  4. Linux的历史发展及应用

    Linux的基本介绍: Linux的历史: 操作系统,英语Operating System简称为OS.说道操作系统就需要先讲一讲Unix,UNIX操作系统,是一个强大的多用户.多任务操作系统,支持多种 ...

  5. LOJ-10104(割点+dfs)

    题目链接:传送门 思路: 求割点的同时求割点删除后所剩的不连通的点的对数,在遍历完成后回溯统计点的个数,具体操作见代码: 注意:结果是long long 类型. #include<iostrea ...

  6. Spring流行的十大理由

    Spring大概是每个JAVA程序员都听过的框架,但是它为什么能这么流行? 听到咕泡学院的Tom老师的公开课,下面是他总结的阿里为什么选择Spring的十大理由,我觉得这也是Spring能流行的原因: ...

  7. Eclipse搭建服务器,实现与Android的简单通信

    ---恢复内容开始--- 目标:实现客户端(Android App)与服务器(PC)的简单通信 相关准备:eclipse_mars.tomcat8.Android Studio 实现: 1.java环 ...

  8. search

    |—search()—|—添加一个列表变量Expend,存储每个小格扩展时为第几步,可打印出 |                    |—打印运动表 |—A*—|— heuristic() |—Dy ...

  9. 基于模型的特征选择详解 (Embedded & Wrapper)

    目录 基于模型的特征选择详解 (Embedded & Wrapper) 1. 线性模型和正则化(Embedded方式) 2. 基于树模型的特征选择(Embedded方式) 3. 顶层特征选择算 ...

  10. pycharm的console显示乱码和中文的配置

    第一种方式: 在python脚本开始的地方加入指定编码方式 # -*- coding : UTF-8 -*- 第二种方式: 有些时候我们会得到这种格式的字符串: "name": & ...