请问这个Converter是靠什么识别转换的?

请问这个Converter是靠什么识别转换的?

1、如果编写了多个自定义转换器类,MyDateConverter,MyLongConverter,MyIntegerConverter...

配置文件中set集合也添加了所有自定义转换器类,是不是只要传入类型与返回类型的关系匹配上以后,就会自动转换? 如果是的话,那因为请求参数传入类型始终是字符串,返回类型如果与Controller方法类型不匹配,比如Long,本来可以自动转换的,但此时因为手动写了MyLongConverter,那个原来自动将字符串“123456”转换为Long型的123456,是不是失效了?

2、如果自定义的两个转换器,它们的重写方法convert()的参数类型与返回类型都相同,但是功能不同,spring会如何判断使用哪个转换器?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,Converter是根据controller中参数的数据类型来进行匹配的,例如在Converter类的泛型中写的是“<String,Long>”,那么当参数中存在Long类型的参数时,就会根据Converter来进行转换。如果恰好两个Converter类的泛型写的完全一样,在<property name="converters">标签内部就不应当使用set标签,而是list标签,并且会按照声明的顺序来生效。

如果恰好在转换的时候,例如转换为Long类型的时候,既有可能使用A方案转换,也有可能使用B方案转换,那么不会使用Converter,而是直接String来接收参数,并单独调用封装了A方案或者B方案的转换方法。毕竟框架不是万能的,很多需要抉择的功能必须由程序设计者手动来指定。

祝学习愉快~

  • 坨坨儿 提问者 #1

    课程里提到:如果想要在Web应用的不同地方使用不同的日期格式,仍然可以使用全局日期转换器,但是在重写convert()方法时,可以通过接收到的日期参数字符串的长度进行条件判断,从而决定转换成哪种日期格式。但是如果两种不同的日期格式传递的字符串的长度又刚好相同,那么这个办法仍然不能解决

    2024-03-21 15:11:58
  • 好帮手慕小蓝 回复 提问者 坨坨儿 #2

    同学你好,课程中表达实际上是同一个转换器类,在内部实现方法的时候去判断(例如在里面添加if判断,根据字符串长度来进入不同处理逻辑),与上面所说创建两个完全不同的Converter类是不一样的方式。

    如上面回答所说,当各项参数都恰好相同的时候,只能手动去指定使用A方案或者B方案,就不要使用转换器了。使用String来接收参数,然后手动去调用A方案或者B方案封装的类即可。例如专门创建一个工具类,提供两个方案对应的静态方法,在controller中不适用Date类型接收而是使用String,接收到之后调用对应的静态方法来转换即可。

    祝学习愉快~

    2024-03-21 15:17:52
  • 坨坨儿 提问者 回复 好帮手慕小蓝 #3

    总而言之,转换器不是万能的,遇到些奇葩问题,还是要自己专门去解决

    2024-03-21 15:24:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1202    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师