最近在研究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")两种注解其中一个都可以