Spring Boot – 自定义PropertyEditor
前言
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的更多相关文章
- spring boot自定义线程池以及异步处理
spring boot自定义线程池以及异步处理@Async:什么是线程池?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使 ...
- Spring Boot自定义配置与加载
Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...
- Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置
0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...
- Spring Boot自定义Redis缓存配置,保存value格式JSON字符串
Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...
- 玩转Spring Boot 自定义配置、导入XML配置与外部化配置
玩转Spring Boot 自定义配置.导入XML配置与外部化配置 在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...
- 峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06 峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...
- Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践
Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...
- Spring Boot自定义starter必知必会条件
前言 在目前的Spring Boot框架中,不管是Spring Boot官方还是非官方,都提供了非常多的starter系列组件,助力开发者在企业应用中的开发,提升研发人员的工作效率,Spring Bo ...
- Spring Boot自定义错误页面,Whitelabel Error Page处理方式
我已经是Spring Framework框架的忠实粉丝.对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题.但是,它构建的J2EE项目变得比较臃肿,需要被一 ...
随机推荐
- AspNetCore OpenId
1 Server端 public class Startup { public Startup(IConfiguration configuration) { Configuration = conf ...
- linux系统下部署DNS反向解析
DNS服务概述 DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 反向解析 反向解析是从IP地址到域名的解析过程.主要作用于服务器的身份验证. 部署反向解析 ...
- [转]etcd 启用 https
1, 生成 TLS 秘钥对 2,拷贝密钥对到所有节点 3,配置 etcd 使用证书 4,测试 etcd 是否正常 5,配置 kube-apiserver 使用 CA 连接 etcd 6,测试 kube ...
- SpringMVC对静态资源的访问(js、css、img)
在网上找了很多的内容,都没法解决,最后通过https://blog.csdn.net/wild46cat/article/details/52456715中内容解决的,在此记录一下. 项目结构: po ...
- html/css 表格元素以及表格布局
一,html之表格 1,一个完整的html表格所包含的元素 <!--一个完整的html表格--> <!--cellpadding代表单元格内的文字和单元格边框之间的间距--> ...
- Object constructor
1. Object is an instance of Function.2. Object does not have a property called constructor so when w ...
- thinkphp 把小程序码二进制流存储到本地
public function getxcxm(){ $id = input('id'); $astk = json_decode($this->getasstk())->access_t ...
- HDU 2149 巴什博奕
点这里去做题 基础的巴什博奕,注意m<n的情况 #include<bits/stdc++.h> int main() { int n,m,r,i; while(scanf(" ...
- lua 使用中遇到的坑总结
前言 竹子是 java 程序员一枚,最近在做一个登录的改造,用 lua 实现,现在基本算是告一段落,然后在此分享下在过程中遇到的坑吧. 一定要注意使用 lua 的版本,版本不同,可能有的函数就没有了, ...
- hive 函数 nvl()
首先用desc function,查看hive给出的函数解释 nvl(value,default_value) - Returns default value if value is null els ...