SpringBoot中Formatter和Converter用法和区别

这篇具有很好参考价值的文章主要介绍了SpringBoot中Formatter和Converter用法和区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能区别:

两者的作用一样,都是类型转换。

org.springframework.format.Formatter只能做String类型到其他类型的转换。

org.springframework.core.convert.converter.Converter可以做任意类型的转换。

Converter是一般工具,可以将一种类型转换成另一种类型。例如,将String转换成Date,或者将Long转换成Date。Converter既可以用在web层,也可以用在其它层中。Formatter只能将String转成成另一种java类型。例如,将String转换成Date,但它不能将Long转换成Date。

Formatter

Formatter使用示例:

1.定义Formatter类:

需要实现Formatter接口, 并在pase方法中进行转换的逻辑。通过@Component自动将其添加到SpringBoot容器,这样就会自动生效。

@Component

public class StudentFormatter implements Formatter<Student> {

/**

* 校验不太严密,仅作演示

*/

@Override

public Student parse(String text, Locale locale) {

if (NumberUtils.isParsable(text)) {

Student s = new Student();

s.setAge(Integer.parseInt(text));

return s;

}

return null;

}

@Override

public String print(Student money, Locale locale) {

if (money == null) {

return null;

}

return money.getAge()+"";

}

}

2.Controller中的代码:

@PostMapping(path = "/stu")

@ResponseBody

public String sst(NewRequest newCoffee) {

return newCoffee.getStudent().getAge()+"";

}

数据实体:

@Getter

@Setter

@ToString

public class NewRequest {

private String name;

private Student student;

}

3.访问:http://localhost:8080/stu

采用application/x-www-form-urlencoded 参数类型传递参数。

这样服务端收到参数,就会自动将字符串转换成一个Student对象。

注意点:这里采用了application/x-www-form-urlencoded提交参数,所以在Controller中不能加@RequestBody,并且参数名称要和数据对象的属性保持一致。如果采用json格式数据交互,测试发现解析报错。

{

"timestamp": "2019-09-05T07:42:00.809+0000",

"status": 400,

"error": "Bad Request",

"message": "JSON parse error: Current token (VALUE_STRING) not numeric, can not use numeric value accessors; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Current token (VALUE_STRING) not numeric, can not use numeric value accessors\n at [Source: (PushbackInputStream); line: 1, column: 29] (through reference chain: geektime.spring.springbucks.waiter.controller.request.NewCoffeeRequest[\"price\"])",

"path": "/coffee/addJson"

}

说明在转换成自定义的对象时,必须通过form格式进行传参。

但奇怪的是Date类型的转换,通过json格式传递参数,可以正常转换。 如下:

@Component

public class DateFormatter implements Formatter<Date> {

@Override

public Date parse(String text, Locale locale) throws ParseException {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

System.out.println("parse input text: " + text);

System.out.println("parse date: " + dateFormat.parse(text));

return dateFormat.parse(text);

}

@Override

public String print(Date object, Locale locale) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

System.out.println("print method." + object);

return dateFormat.format(object);

}

}

Controller中:

@ResponseBody

@PostMapping(path = "/date")

public String formatterStringToDate(@RequestBody ZXRequest date) {

System.out.println("action method: " + date.getDate().getTime());

return date.getDate().getTime()+"";

}

数据类:

@Getter

@Setter

@ToString

public class ZXRequest {

private Date date;

}

访问:

可以正常返回。说明转换正确。关于原因,目前尚不清楚,有知道的,希望留言。

Converter使用示例:

1.创建转换类:其他步骤和Formatter完全一样。

@Component

public class StudentConvert implements Converter<String ,Student> {

@Override

public Student convert(String text) {

if (NumberUtils.isParsable(text)) {

Student s = new Student();

s.setAge(Integer.parseInt(text));

return s;

}

return new Student();

}

}

如果同时定义了Converter和Formatter,并且转换同一个类型,会采用哪个进行转换?

测试证明,同时定义Student的转换类,会采用Formatter。文章来源地址https://www.toymoban.com/news/detail-501041.html

到了这里,关于SpringBoot中Formatter和Converter用法和区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • #Ts篇:符号`?.` 、`??` 、 `!` 、 `?: `的用法和区别

    ?. 定义 可选属性操作符 例如:obj?.prop。 如果 obj = null || undefined ==== undefined, 在上面的示例中, person1.age 和 person2.age 都可能为 undefined, 因为 age 属性是可选的。 而在访问 job.title 属性时,我们使用了可选属性访问操作符 ?. , 如果 person1.job 或 person2.job 为 null 或 undefined,

    2024年02月08日
    浏览(101)
  • Comparable和Comparator的用法和区别

    文章目录 前言 一 .Comparable 1.Comparable是什么? 2.comparable有用吗? 有用的话它有什么用? 没学compar之前的解决办法 :  2.在学习了comparable之后 二.comparator 1.comparator是什么? 2.comparator怎么用? 3.两者的差异 总结 在这里给大家整理了一下comparable和comparator的用法和区别,这些在以后代码

    2024年02月05日
    浏览(42)
  • @Service和@Component注解的区别和用法

    @Service和@Component注解在Spring框架中都用于标注类,以便Spring容器能够自动识别并创建其实例。然而,这两个注解在用法和区别上却有着不同的目的和效果。本文将详细介绍这两个注解的用法和区别,并通过示例代码进行演示。 一、@Service注解 @Service注解是Spring框架中用于标注

    2024年02月06日
    浏览(38)
  • 浅谈postman和jmeter的用法与区别

    前阶段做了一个小调查,发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中,有高手,自然也会有小白,但有一点我们无法否认,就是每一个高手都是从小白开始的,所以今天我们就来谈谈一大部分人在做的接口测试,小白变高手也许你只差这一次深入

    2024年01月24日
    浏览(44)
  • calloc、malloc、realloc函数的区别及用法

    三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异。 (1)malloc函数。其原型void *malloc(unsigned int num_bytes); num_byte为要申请的空间大小,需要我们手动的去计算,如int *p = (int )malloc(20 sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请

    2024年02月08日
    浏览(46)
  • Junit和Junit.Jupiter.api用法区别

    Junit 和 Junit.Jupiter.api 用法区别写在了文章的总结处,这里先简单的介绍一下Junit用法。 Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage Junit4中的@Test是import org.junit.Test; Jupiter中的@Test是import org.junit.jupiter.api.Test; 开发步骤 ①引入spring-test依赖 ②定义单元测试类 ①引入spring-test依赖

    2024年02月08日
    浏览(34)
  • 【C++】sizeof()、size()、length()的用法及区别

    在c++中,length()只是用来获取字符串的长度。在获取字符串长度的时候size()和length()函数作用相同。 size函数除了可以获取字符串长度外,还可以获取vector类型的长度。 在c++中,sizeof()用于获取数据类型或者变量所占内存空间的大小。可以通过sizeof计算获取数组元素个数。

    2024年02月14日
    浏览(42)
  • PHP两个三元运算符“??” 和“?:”的用法和区别

    在PHP 7中,有两个类似的语法结构:“??”和“?:”,它们都是用于处理条件判断和返回值的运算符。尽管它们看起来相似,但它们的作用和用法有一些区别。 \\\"?:\\\"是三目运算符,语法格式为:$result = $test ? t e s t : ′ ′ ; 意思就是当 test:\\\'\\\';意思就是当 t es t : ′′ ; 意思就是当

    2024年03月17日
    浏览(47)
  • Python学习.iloc和.loc区别、联系与用法

    最近接触到数据科学,需要对一些数据表进行分析,观察到代码中一会出现loc一会又出现iloc,下面对两者的用法给出我的一些理解。 (1)操作对象相同:loc和iloc都是对DataFrame类型进行操作; (2)完成目的相同:二者都是用于选取DataFrame中对应行或列中的元素。 loc和iloc索引的行

    2023年04月08日
    浏览(41)
  • C语言中,float跟double的区别及用法

    顾得泉: 个人主页 个人专栏: 《Linux操作系统》  《C/C++》  《LeedCode刷题》 键盘敲烂,年薪百万! float和double都是用来表示浮点数的数据类型,但是它们之间有一些区别:        存储大小:float占4个字节(32位),double占8个字节(64位)。        精度:double比float精度

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包