最近在研究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")