在Spring3中引入了一个Converter接口,它支持从一个Object转为另一个Object。除了Converter接口之外,实现ConverterFactory接口和GenericConverter接口也可以实现我们自己的类型转换逻辑。

Converter接口

首先看看Converter接口的定义

public interface Converter<S, T> {  T convert(S source);  }

可以看到这个接口是使用了泛型的,S表示原类型,T表示目标类型,然后里面定义了一个convert方法,将原类型对象作为参数传入进行转换之后返回目标类型对象。

下面在Spring Boot中使用Converter接口来实现将String类型分别转换为Data,自定义对象和List<自定义对象>。

添加依赖

添加spring-boot-starter-web依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

实体类

1.User类

public class User {private long  id;//用户名private String name;//出生日期private Date birth;//关联用户private User linkUser;//喜欢的文章private List<Article> favArticles=new ArrayList<>();//下面省略Getter和Setter方法

2.Article类

public class Article {//文章idprivate long artId;//文章名private String artName;//下面省略Getter和Setter方法
}

配置类型转化器

下面三个类都需要添加@Component注解,否则不能生效。并实现Spring提供的org.springframework.core.convert.converter.Converter接口,重写其中的convert()方法 ,方法中写自己的转换逻辑。

1.定义全局日期转换器

@Component
public class DateConvert implements Converter<String,Date> {//日期格式SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");@Overridepublic Date convert(String s) {if (s!=null&&!"".equals(s)){try {//解析参数Date date=sdf.parse(s);return date;} catch (ParseException e) {e.printStackTrace();}}return null;}
}

2.定义全局对象转换器

这里使用Jackson的ObjectMapper类的readValue()函数实现将Json字符串反序列化为Java对象

@Component
public class ObjectConvert implements Converter<String,User> {@Overridepublic User convert(String s) {ObjectMapper objectMapper=new ObjectMapper();if (s!=null&&!"".equals(s)){try {User user=objectMapper.readValue(s,User.class);return user;} catch (JsonProcessingException e) {e.printStackTrace();}}return null;}
}

3.定义全局List类型转换器

这里使用Jackson的ObjectMapper类的readValue()函数实现将Json字符串反序列化为 List

@Component
public class StringToListController implements Converter<String, List<Article>> {ObjectMapper objectMapper=new ObjectMapper();@Overridepublic List<Article> convert(String s) {List<Article> list=null;try {list=objectMapper.readValue(s, new TypeReference<List<Article>>() {});} catch (JsonProcessingException e) {e.printStackTrace();}return list;}
}

控制器

这里注意使用produces设置返回数据的类型为json,consumes设置提交内容的类型为:application/x-www-form-urlencoded

application/x-www-form-urlencoded作用:将键值对的参数用&连接起来,如果有空格,将空格转换为+加号;有特殊符号,将特殊符号转换为ASCII HEX值。


@RestController
public class HelloController {@GetMapping("hello")public Date getDate(Date birth){System.out.println(birth);return birth;}@PostMapping(value="showUser",produces="application/json",consumes = "application/x-www-form-urlencoded")public User showUser(User user){return user;}
}

测试

在Postman中进行测试,注意以下设置:POST请求 -> Body -> x-www-form-urlencoded。在Body中输入参数进行测试。
因为参数中有Json类型参数,如果直接使用Params下进行发送数据,会出现请求参数异常错误。

测试结果:

Spring Boot中使用Convert接口实现类型转换器相关推荐

  1. Spring Boot 中关于 %2e 的 坑,希望你不要遇到

    作者 | Ruilin 来源 | http://rui0.cn/archives/1643 分享一个Spring Boot中关于%2e的小Trick. 先说结论,当Spring Boot版本在小于等于 ...

  2. boot spring 接口接收数据_在 Spring Boot 中使用 Dataway 配置数据查询接口

    Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具.使得使用者无需开发任何代码就配置一个满足需求的接口. 整个接口配置.测试.冒烟.发布.一站式都通过 ...

  3. Spring Boot 中如何统一 API 接口响应格式?

    今天又要给大家介绍一个 Spring Boot 中的组件–HandlerMethodReturnValueHandler. 在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?) ...

  4. 如何在Spring Boot中使用TDD写出高质量的接口

    本文发布于专栏Effective Java,如果您觉得看完之后对你有所帮助,欢迎订阅本专栏,也欢迎您将本专栏分享给您身边的工程师同学. 之前在<如何说服你的同事使用TDD>中介绍了为什么要 ...

  5. Spring Boot中使用Redis数据库

    Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, So ...

  6. Spring Boot中的配置文件使用以及重新加载

    Spring Boot中的配置文件使用以及重新加载 概要 本教程将展示如何通过Java configuration和@PropertySource或XML和property-placeholder在S ...

  7. Spring Boot中使用Spring-Retry重试框架

    文章目录 Spring Boot中使用Spring-Retry重试框架 Maven依赖 注解使用 开启Retry功能 注解`@Retryable` 注解`@Recover` 注解`@CircuitBr ...

  8. Spring Boot中如何扩展XML请求和响应的支持

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  9. Spring Boot中使用LDAP来统一管理用户信息

    很多时候,我们在构建系统的时候都会自己创建用户管理体系,这对于开发人员来说并不是什么难事,但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下,如果每个系统维护自己的用户信息,那么此时用户信息 ...

最新文章

  1. linux slf4j找不到,SLF4J错误消息
  2. Spring对象绑定与类型转换
  3. 算法系列之选择排序算法
  4. 美图秀秀滤镜之饱和度
  5. Oracle 远程 RAC 打造双活数据中心 | 从容灾迈向双活案例分享
  6. Android五天乐(第三天)ListFragment与ViewPager
  7. Oracle中的环境变量(ORACLE_HOME 和 ORACLE_SID)
  8. python如何转换数据集_将数据集转换为HDF5数据
  9. 运用现代信息技术 推进环评大数据建设
  10. STM32进行软件调试步骤:
  11. Chrome网页视频加速器介绍
  12. Python实现测量平差数据处理
  13. 深度学习笔记----计算机视觉的任务及对应的网络模型
  14. CTFshow刷题日记-WEB-JAVA(web279-300)Struts2全漏洞复现,Java漏洞复现
  15. Android 获取CellId以及IMEI 获取基站id
  16. EXCEL之函数调用
  17. canvas-网页蜘蛛网特效代码解读
  18. 【转】怎么在Linux上安装打印机驱动(以Ubuntu为例)
  19. 商业模式画布包含哪些东西
  20. 现代时尚人像调色效果Lr预设

热门文章

  1. Schema Compare 使用手册
  2. windows系统信息修改
  3. 项目学习--谷粒商城
  4. 用Assimp模型加载库加载一个Crytek的游戏孤岛危机(Crysis)中的原版纳米装(Nanosuit)
  5. Python从Bing壁纸的API接口保存图片
  6. LED驱动电源不足,都有哪些原因
  7. leetcode 1658
  8. lstm模型_基于LSTM模型的学生反馈文本学业情绪识别方法
  9. 软工实习(四)jsp基础
  10. 湖北c语言二级考试真题,湖北省计算机二级C语言考试.pdf