`

Spring MVC 学习笔记conversion-service data binding

阅读更多

Servlet中的输入参数为都是string类型,而spring mvc通过data bind机制将这些string 类型的输入参数转换为相应的command object(根据view和controller之间传输数据的具体逻辑,也可称为model attributes, domain model objects)。在这个转换过程中,spring实际是先利用java.beans.PropertyEditor中的 setAdText方法来把string格式的输入转换为bean属性, 亦可通过继承java.beans.PropertyEditorSupport来实现自定义的PropertyEditors,具体实现方式可参考 spring reference 3.0.5 第 5.4节中的 Registering additional custom PropertyEditors部分。 自定义完毕propertyEditor后,有以下几种方式来注册自定义的customer propertyEditor.

 1:直接将自定义的propertyEditor放到需要处理的java bean相同的目录下

名称和java Bean相同但后面带Editor后缀。 例如需要转换的java bean 名为User,则在相同的包中存在UserEditor类可实现customer propertyEditor的自动注册。

2:利用@InitBinder来注册customer propertyEditor

这个在之前的笔记中已经介绍过了,即在controller类中增加一个使用@InitBinder标注的方法,在其中注册customer Editor

复制代码
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(
                dateFormat, false));
    }
复制代码

3:继承 WebBindingInitializer 接口来实现全局注册 使用@InitBinder只能对特定的controller类生效,为注册一个全局的customer Editor,可以实现接口WebBindingInitializer 。

复制代码
public class CustomerBinding implements WebBindingInitializer {
    @Override
    public void initBinder(WebDataBinder binder, WebRequest request) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(
                dateFormat, false));

    }
复制代码

并修改 servlet context xml配置文件

复制代码
<bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="webBindingInitializer">
            <bean
                class="net.zhepu.web.customerBinding.CustomerBinding" />
        </property>
    </bean>
复制代码

但这样一来就无法使用mvc:annotation-driven  了。
使用conversion-service来注册自定义的converter DataBinder实现了PropertyEditorRegistry, TypeConverter这两个interface,而在spring mvc实际处理时,返回值都是return binder.convertIfNecessary(见HandlerMethodInvoker中的具体处理逻辑)。因此可以使用customer conversionService来实现自定义的类型转换。

复制代码
        <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

        <property name="converters">
            <list>
                <bean class="net.zhepu.web.customerBinding.CustomerConverter" />
            </list>
        </property>
        
    </bean>
复制代码

 

需要修改spring service context xml配置文件中的annotation-driven,增加属性conversion-service指向新增的conversionService bean。

    <mvc:annotation-driven validator="validator"
        conversion-service="conversionService" />

实际自定义的converter如下。

复制代码
 public class CustomerConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        try {
            return dateFormat.parse(source);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
        return null;
    }
复制代码

对于requestBody或httpEntity中数据的类型转换 Spring MVC中对于requestBody中发送的数据转换不是通过databind来实现,而是使用HttpMessageConverter来实现具体的类 型转换。 例如,之前提到的json格式的输入,在将json格式的输入转换为具体的model的过程中,spring mvc首先找出request header中的contenttype,再遍历当前所注册的所有的HttpMessageConverter子类, 根据子类中的canRead()方法来决定调用哪个具体的子类来实现对requestBody中的数据的解析。如果当前所注册的 httpMessageConverter中都无法解析对应contexttype类型,则抛出 HttpMediaTypeNotSupportedException (http 415错误)。 那么需要如何注册自定义的messageConverter呢,很不幸,在spring 3.0.5中如果使用annotation-driven的配置方式的话,无法实现自定义的messageConverter的配置,必须老老实实的自己 定义AnnotationMethodHandlerAdapter的bean定义,再设置其messageConverters以注册自定义的 messageConverter。 在3.1版本中,将增加annotation-driven对自定义的messageConverter的支持 (SPR-7504),具体格式如下

 

复制代码
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>
复制代码
分享到:
评论

相关推荐

    spring MVC .docx

    10. **Conversion and Validation**: Spring MVC提供了数据转换和验证功能,如使用`@RequestParam`、`@PathVariable`注解自动转换参数,以及使用`@Valid`和`BindingResult`进行表单验证。 11. **Tiles or Layouts**...

    DImension-conversion-of-data.zip_original_data_reshape_them

    总的来说,"DImension-conversion-of-data.zip_original_data_reshape_them"涉及到的关键知识点包括:原始数据处理、图像预处理、数据重塑、3D到2D的数据转换,以及这些操作在图像分析和深度学习中的应用。...

    [OPAMP] Principles of Data Conversion System Design (IEEE Press - Behzad Razavi)_p136.pdf

    1. 标题中出现的书籍名称为《Principles of Data Conversion System Design》,作者是Behzad Razavi。这本书是IEEE出版社出版的,由电子与电气工程师学会(IEEE)资助。 2. 描述部分没有提供额外的信息,只是重复了...

    double-conversion-devel-3.1.5-4.el8.aarch64.rpm

    离线安装包,亲测可用

    Python库 | Dataconversion-1.0-py3-none-any.whl

    标题中的"Python库 | Dataconversion-1.0-py3-none-any.whl"指的是一个针对Python编程语言的库,名为Dataconversion,版本为1.0。这个库是通过Python的.whl(Wheel)格式进行分发的,这是一种预编译的Python软件包...

    principles-of-data-conversion-system-design.pdf

    Razavi 1995年关于数据转换器之作,完整版,经典之作,影印版

    spring-framework-4-reference

    Validation, Data Binding, and Type Conversion部分讲解了Spring中如何进行验证、数据绑定和类型转换。Spring提供了一个Validator接口,可以用来执行验证操作,并且可以将错误代码解析为错误信息。BeanWrapper类...

    spring mvc框架源码

    8. **Conversion and Validation**: Spring MVC提供了一套完整的数据绑定、类型转换和验证机制。比如,@RequestParam、@PathVariable等注解用于从请求参数中获取数据,@Valid用于数据验证。 9. **Tiles, FreeMarker...

    PyPI 官网下载 | Dataconversion-1.0-py3-none-any.whl

    资源来自pypi官网。 资源全名:Dataconversion-1.0-py3-none-any.whl

    深入解析Spring MVC与Web Flow

    Spring MVC和Web Flow是两种..."深入解析Spring MVC与Web Flow.pdf"这本书可能会详细阐述这些概念,包括如何配置、如何编写控制器、如何定义和管理流程,以及如何将两者整合,是学习和掌握这两种技术的重要参考资料。

    ADI Sigma-Delta-Conversion-Used-For-Motor-Control.pdf

    AbstractƩ-Δ analog-to-digital converters are widely used in motor drives where high signal integrity and galvanic isolation are required. While the Σ-Δ technology itself is well understood, the ...

    spring mvc3.1.0 日期自动转换

    Spring MVC 3.1.0通过提供数据绑定(Data Binding)和类型转换(Type Conversion)机制,简化了这个过程。 1. 数据绑定:Spring MVC的数据绑定允许我们直接将HTTP请求参数映射到控制器方法的参数上。例如,一个`@...

    Spring Data MongoDB中文文档

    ### Spring Data MongoDB中文文档知识点概览 #### 一、Spring Data MongoDB概述 - **Spring Data MongoDB** 是 **Spring Data** 家族的一员,它提供了一种简单的方式来与 MongoDB 数据库进行交互。通过 Spring Data...

    spring-frame-4-reference

    #### Validation, Data Binding, and Type Conversion Spring提供了强大的验证、数据绑定和类型转换功能,这对于Web开发尤为重要。主要包括以下几个方面: - **Validation using Spring’s Validator interface**...

    FFmpeg-Conversion-Stream.tar

    linux平台上基于ffmpeg源码的视频格式转换器,比如MP4转FLV等

    spring mvc 架构源代码

    通过分析这个项目,你可以学习到如何配置Spring MVC、如何编写Controller、如何设计服务层和数据访问层,以及如何集成其他框架如MyBatis进行持久化操作。此外,还可以了解到如何使用Maven或Gradle进行项目管理,以及...

    spring mvc入门小例子

    Spring MVC 是一款强大的Java Web开发框架,用于构建高效、可维护的Web应用程序。它作为Spring框架的一部分,提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据处理和用户界面分离,使得...

    Spring MVC3复杂表单终极解决办法

    在Spring MVC中,这种复杂性可以通过模型绑定(Model Binding)和数据转换(Data Conversion)机制来简化处理。 1. **模型绑定**: Spring MVC支持基于注解的模型绑定,允许开发者通过`@ModelAttribute`注解将HTTP...

    如果面试问你Spring MVC的原理

    9. **Validation**:Spring MVC提供了数据验证功能,可以通过`@Valid`注解对模型对象进行验证,错误信息可以通过`BindingResult`对象获取。 10. **Async Support**:Spring MVC支持异步处理,可以通过`@Async`注解...

Global site tag (gtag.js) - Google Analytics