5.盘点springmvc的常用接口之Converter(上篇)
2016-07-04 17:44
429 查看
5.盘点springmvc的常用接口之Converter(上篇)###
前言
上一章讲完了已淘汰的PropertyEditor转换器,那么这一章隆重介绍新的转换器
org.springframework.core.convert.converter.Converter。(别看这接口也叫Converter,和前几章讲到的那个
HttpMessageConverter不是同一个东西,千万不要搞混了-_-)。
PropertyEditor的缺点其实很明显,它只能实现从String转化到目标类型。
而
Converter可以实现从任意的原类型转化到目标类型。
接口说明
public interface Converter<S, T> { T convert(S source); }
泛型S,T 分别为source原类型,target目标类型。
方法
convert即为转换过程。
示例1
使用Converter接口重新实现上一章的转化Telephone
package com.demo.mvc.component; import org.springframework.core.convert.converter.Converter; import com.demo.domain.Telephone; public class TelephoneConverter implements Converter<String, Telephone> { @Override public Telephone convert(String source) { if (StringUtils.hasText(source) && source.matches("^\\d+\\-\\d+$")) { String[] strs = source.split("\\-"); return new Telephone(strs[0], strs[1]); } return null; } }
package com.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.demo.domain.Person; import com.demo.domain.Telephone; import lombok.extern.slf4j.Slf4j; @Slf4j @Controller @RequestMapping("demo5") public class ConverterDemoController { @ResponseBody @RequestMapping(method = RequestMethod.POST) public String postTelephone(@RequestParam Telephone telephone) { log.info(telephone.toString()); return telephone.toString(); } }
spring-boot注册:
package com.demo; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.format.support.FormattingConversionService; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import com.demo.mvc.component.TelephoneConverter; @SpringBootApplication public class WebMvcConfiguration extends WebMvcConfigurationSupport { @Override public FormattingConversionService mvcConversionService() { TelephoneConverter telephoneConverter = new TelephoneConverter(); FormattingConversionService formattingConversionService = super.mvcConversionService(); formattingConversionService.addConverter(telephoneConverter); return formattingConversionService; } }
xml注册:
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.demo.mvc.component.TelephoneConverter"/> </set> </property> </bean>
示例2
很多朋友都问过我如何把类似“2016-01-01 01:00:00”这样的字符串时间传到控制器中的Date类型。如果不知道
Converter的话,只能传字符串过去,在Controller里写硬代码转换,那就又成了垃圾代码。
Converter也可以转化表单数据到实体中各个属性。下面是的示例展示表单数据赋值进Person对象中,其中java.util.Date和Telephone默认是不能直接从字符串到对象的。
实体追加属性:
package com.demo.domain; import java.util.Date; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor public class Person { private String firstName; private String lastName; private Telephone telephone; private Date registerTime; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return firstName + " " + lastName; } }
String到
java.util.Date的转换器:
package com.demo.mvc.component; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.core.convert.converter.Converter; import org.springframework.util.StringUtils; public class StringToUtilDateConverter implements Converter<String, java.util.Date> { private DateFormat df; public StringToUtilDateConverter(String pattern) { df = new SimpleDateFormat(pattern); } @Override public Date convert(String source) { if (StringUtils.hasText(source)) { try { return df.parse(source); } catch (ParseException e) { e.printStackTrace(); } } return null; } }
controller:
@ResponseBody @RequestMapping(value = "person", method = RequestMethod.POST) public String postPerson(Person person) { log.info(person.toString()); log.info(person.getTelephone().toString()); log.info(person.getRegisterTime().toString()); return person.toString(); }
转换器注册略,和示例1相同。
测试访问POST http://localhost:8080/demo5
表单数据:
firstName = Bill
lastName = Gates
telephone = 010-12345
registerTime = 2016-01-01 01:00:00
Person类中的Telephone和Date都能被正确赋值。
那么问题来了,假如
PropertyEditor和
Converter同时使用会怎么样呢?
Spring的策略是先查找
PropertyEditor进行类型转换,如果没有找到相应的
PropertyEditor再通过
Converter进行转换。
附录:Spring内置的各种转换器
标量转换器
转换器类 | 功能 |
---|---|
StringToBooleanConverter | String----->Boolean true: true/on/yes/1;false: false/off/no/0 |
ObjectToStringConverter | Object----->String 调用toString方法转换 |
StringToNumberConverterFactory | String----->Number(如Integer、Long等) |
NumberToNumberConverterFactory | Number子类型(Integer、Long、Double等)-----> Number子类型(Integer、Long、Double等) |
StringToCharacterConverter | String----->java.lang.Character 取字符串第一个字符 |
NumberToCharacterConverter | Number子类型(Integer、Long、Double等)-----> java.lang.Character |
CharacterToNumberFactory | java.lang.Character ----->Number子类型(Integer、Long、Double等) |
StringToEnumConverterFactory | String----->enum类型 |
EnumToStringConverter | enum类型----->String 返回enum对象的name()值 |
StringToLocaleConverter | String----->java.util.Local |
PropertiesToStringConverter | java.util.Properties----->String |
StringToPropertiesConverter | String----->java.util.Properties |
转换器类 | 功能 |
---|---|
ArrayToCollectionConverter | 任意S数组---->任意T集合(List、Set) |
CollectionToArrayConverter | 任意T集合(List、Set)---->任意S数组 |
ArrayToArrayConverter | 任意S数组<---->任意T数组 |
CollectionToCollectionConverter | 任意T集合(List、Set)<---->任意T集合(List、Set) |
MapToMapConverter | Map<---->Map之间的转换 |
ArrayToStringConverter | 任意S数组---->String类型 |
StringToArrayConverter | String----->数组 默认通过“,”分割,且去除字符串的两边空格(trim) |
ArrayToObjectConverter | 任意S数组---->任意Object的转换 |
ObjectToArrayConverter | Object----->单元素数组 |
CollectionToStringConverter | 任意T集合(List、Set)---->String类型 |
StringToCollectionConverter | String----->集合(List、Set) |
CollectionToObjectConverter | 任意T集合---->任意Object的转换 |
ObjectToCollectionConverter | Object----->单元素集合 |
转换器类 | 功能 |
---|---|
ObjectToObjectConverter | Object(S)----->Object(T)首先尝试valueOf进行转换、没有则尝试new 构造器(S) |
IdToEntityConverter | Id(S)----->Entity(T) |
FallbackObjectToStringConverter | Object----->String 最终转换方法,调用toString() |
Converter的介绍还没有完,在下一章将介绍更加深入的使用
Converter。
友情链接:
盘点springmvc的常用接口目录
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树