首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在春季,PropertyEditor、格式化程序和转换器有什么区别?

在春季,PropertyEditor、格式化程序和转换器有什么区别?
EN

Stack Overflow用户
提问于 2022-03-17 16:15:49
回答 1查看 333关注 0票数 3

通过使用Spring MVC,我可以用许多不同的方式绑定我的表单,我真的觉得自己迷路了。parseprint方法与具有不同名称的PropertyEditorSupport (getAsTextsetAsText)的方法等价。类似地,我可以实现一个GenericConverter或两个Converter<S,T>来做完全相同的事情。

我在评论中看到这里FormattersPropertyEditor的替代品,但我还没有找到任何支持它的文档,甚至也没有人反对它。

我的问题是,当将数据从表单绑定到对象时,在spring-mvc中正确的方法是什么?PropertyEditorFormatterConverter在春季的主要区别是什么?每个用例是什么?对我来说他们也有同样的责任。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-20 15:30:03

为了帮助理解这些概念,我首先要区分Spring特定的功能和Java公开的功能。

PropertyEditors和相关资料JavaBeans规范定义。

该规范将用于处理对象、对象属性以及与其更改相关的一切的API、机制和约定定义为事件。

PropertyEditor在GUI中通常用于处理UI与底层对象模型之间的交互,通常处理属性值与其String表示之间的转换。

Spring本身实际上在许多不同的情况下使用不同的PropertyEditor实现和Java约定。例如,从文档

在Spring中使用属性编辑的几个示例:

  • 在bean上设置属性是通过使用PropertyEditor实现完成的。当您使用String作为在XML文件中声明的某个bean的属性值时,Spring (如果相应属性的设置程序有Class参数)使用ClassEditor尝试将参数解析为Class对象。
  • 在Spring框架中解析HTTP请求参数是通过使用各种PropertyEditor实现完成的,您可以在CommandController的所有子类中手动绑定这些实现。

总之,PropertyEditor允许您使用更多的用例。

现在,在Spring世界中,您还需要区分Spring和Spring。

请注意,转换格式化程序都被定义为核心技术,与任何用例相关,而不限于web框架。

在描述弹簧字段格式时,Spring文档对每个API/SPI的用途以及它们与PropertyEditor的关系提供了很好的解释:

正如上一节所讨论的,core.convert是一个通用的类型转换系统.它提供了一个统一的ConversionService API以及一个强类型的转换器SPI,用于实现从一种类型到另一种类型的转换逻辑。Spring容器使用此系统绑定bean属性值。此外,(SpEL)和DataBinder都使用这个系统绑定字段值。例如,当SpEL需要强制ShortLong以完成expression.setValue(Object bean, Object value)尝试时,core.convert系统执行强制。 现在考虑典型客户端环境(如web或桌面应用程序)的类型转换需求。在这种环境中,您通常从String转换为支持客户端回发过程,以及返回到String以支持视图呈现过程。此外,您通常需要本地化String值。更通用的core.convert转换器SPI不直接处理此类格式要求。为了直接解决这些问题,Spring 3引入了一个方便的格式化程序SPI,它为客户端环境提供了一个简单而健壮的替代PropertyEditor实现的方法。 通常,当需要实现通用类型转换逻辑(例如,java.util.DateLong之间的转换)时,可以使用转换器SPI。当您在客户端环境(如web应用程序)中工作并需要解析和打印本地化字段值时,可以使用格式化程序SPI。ConversionService为两个API提供了统一的类型转换API。

在Spring的特定用例中,框架本身能够处理处理HTTP请求时的简单类型。

类型转换是基于配置的一组转换器自动应用的,尽管可以使用S和前面提到的格式化系统来调整这种行为。请看相关文档

在处理读取和写入HTTP请求和响应的典型用例中,例如,当使用@RequestBody时,Spring将使用一系列不同的预配置 HttpMessageConverter实现:实际注册的实现将取决于您的配置和在您的项目中导入的库-例如杰克逊。我无法在文档中找到这一点,但下面是指向实际源代码的链接。

请考虑一下这是个相关的问题,它可能会有帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71515687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档