通过使用Spring MVC,我可以用许多不同的方式绑定我的表单,我真的觉得自己迷路了。parse和print方法与具有不同名称的PropertyEditorSupport (getAsText和setAsText)的方法等价。类似地,我可以实现一个GenericConverter或两个Converter<S,T>来做完全相同的事情。
我在评论中看到这里说Formatters是PropertyEditor的替代品,但我还没有找到任何支持它的文档,甚至也没有人反对它。
我的问题是,当将数据从表单绑定到对象时,在spring-mvc中正确的方法是什么?PropertyEditor、Formatter和Converter在春季的主要区别是什么?每个用例是什么?对我来说他们也有同样的责任。
发布于 2022-03-20 15:30:03
为了帮助理解这些概念,我首先要区分Spring特定的功能和Java公开的功能。
PropertyEditors和相关资料由JavaBeans规范定义。
该规范将用于处理对象、对象属性以及与其更改相关的一切的API、机制和约定定义为事件。
PropertyEditor在GUI中通常用于处理UI与底层对象模型之间的交互,通常处理属性值与其String表示之间的转换。
Spring本身实际上在许多不同的情况下使用不同的PropertyEditor实现和Java约定。例如,从文档
在Spring中使用属性编辑的几个示例:
PropertyEditor实现完成的。当您使用String作为在XML文件中声明的某个bean的属性值时,Spring (如果相应属性的设置程序有Class参数)使用ClassEditor尝试将参数解析为Class对象。PropertyEditor实现完成的,您可以在CommandController的所有子类中手动绑定这些实现。总之,PropertyEditor允许您使用更多的用例。
现在,在Spring世界中,您还需要区分Spring和Spring。
请注意,转换和格式化程序都被定义为核心技术,与任何用例相关,而不限于web框架。
在描述弹簧字段格式时,Spring文档对每个API/SPI的用途以及它们与PropertyEditor的关系提供了很好的解释:
正如上一节所讨论的,
core.convert是一个通用的类型转换系统.它提供了一个统一的ConversionServiceAPI以及一个强类型的转换器SPI,用于实现从一种类型到另一种类型的转换逻辑。Spring容器使用此系统绑定bean属性值。此外,(SpEL)和DataBinder都使用这个系统绑定字段值。例如,当SpEL需要强制Short到Long以完成expression.setValue(Object bean, Object value)尝试时,core.convert系统执行强制。 现在考虑典型客户端环境(如web或桌面应用程序)的类型转换需求。在这种环境中,您通常从String转换为支持客户端回发过程,以及返回到String以支持视图呈现过程。此外,您通常需要本地化String值。更通用的core.convert转换器SPI不直接处理此类格式要求。为了直接解决这些问题,Spring 3引入了一个方便的格式化程序SPI,它为客户端环境提供了一个简单而健壮的替代PropertyEditor实现的方法。 通常,当需要实现通用类型转换逻辑(例如,java.util.Date和Long之间的转换)时,可以使用转换器SPI。当您在客户端环境(如web应用程序)中工作并需要解析和打印本地化字段值时,可以使用格式化程序SPI。ConversionService为两个API提供了统一的类型转换API。
在Spring的特定用例中,框架本身能够处理处理HTTP请求时的简单类型。
类型转换是基于配置的一组转换器自动应用的,尽管可以使用S和前面提到的格式化系统来调整这种行为。请看相关文档。
在处理读取和写入HTTP请求和响应的典型用例中,例如,当使用@RequestBody时,Spring将使用一系列不同的预配置 HttpMessageConverter实现:实际注册的实现将取决于您的配置和在您的项目中导入的库-例如杰克逊。我无法在文档中找到这一点,但下面是指向实际源代码的链接。
请考虑一下这是个相关的问题,它可能会有帮助。
https://stackoverflow.com/questions/71515687
复制相似问题