springmvc框架中数据类型转换问题

最近在研究springmvc框架,中间看到前端到后端数据传送问题,在这边记录下,防止以后忘记,同时给需要的人一些参考。一般数据通过http传送到后端类型都是字符串,如果后端使用对象接且对象里面有日期类型,就回报400,这个时候我们需要配置springmvc让他能够接受不报错。现在介绍几种常用的方法,网上都有,我这边根据实际测试汇总一样。

第一种:通过在某个后端控制层中编写转换处理这种问题(缺点:不能再全局使用,只能单个控制层中有效,不利于项目开发)

代码如下:在需要的控制层中添加如下代码:

   @InitBinder
    public void initBinder(WebDataBinder binder){
       binder.registerCustomEditor(Date.class,new DataEditor());
    }
创建字符串转换成日期类型同时继承propertyEditorSupport并重写setAsText方法
public class DataEditor extends PropertyEditorSupport {
 
 
    @Override
    public void setAsText(String text) throws java.lang.IllegalArgumentException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            setValue(format.parse(text));
        } catch (Exception e) {
            System.out.println("异常了");
        }

    }
}

 
 

第二种:可以在全局配置下,springmvc框架中所有的地方都可以使用,不需要手动在控制层中在另行配置

在springmvc框架的DispatcherServlet的配置文件中添加,代码如下:

 
 
<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
 
 
<!--自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="类型转换处理方法路径></bean>
        </list>
    </property>
</bean>
其中类型转换处理方法代码可如下:
public class converData implements Converter<String,Date>{
    @Override
    public Date convert(String s) {
        try{
            SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
            return format.parse(s);
        }catch (Exception e){
            System.out.println("异常了");
            return null;
        }


    }
}
以上两种方法一般用在前端直接form表格提交,后端控制层中使用对象接受 如:

public void getUserName(User user){

}

第三种:随着现在ajax比较流行,许多开发使用ajax传送数据:这个时候我们可以在控制层中使用@RequestBody

注解接收ajax传送的数据,这个时候我们可以在全局配置文件中添加如下地代码:

<mvc:annotation-driven>
    <mvc:message-converters>
        <!--客户端Json数据到后台 Java 类对象,或者后台 Java 类对象到 客户端Json数据 -->
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="dateFormat">

                        <bean class="java.text.SimpleDateFormat">
                            <constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
                        </bean>

                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
第三种方法需要引入jar文件,否者报错,jackson-annotations-2.5.3.jar,jackson-core-2.5.3.jar,jackson-databind-2.5.3.jar

第三种方法后端控制层中接收时,需要在参数中使用@RequestBody才会有效果(前端ajax传送类型为contentType=application/json")


第四种方法:在对象中的字段中使用
@DateTimeFormat(pattern = "yyyy-MM-dd") 

@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")两种注解其中一个都可以




猜你喜欢

转载自blog.csdn.net/xiaozhou1231/article/details/80346050