在做web开发的时候,页面传入的都是String类型,SpringMVC可以对一些基本的类型进行转换,但是对于日期类的转换可能就需要我们配置。
1、如果查询类使我们自己写,那么在属性前面加上@DateTimeFormat(pattern = "yyyy-MM-dd") ,即可将String转换为Date类型,如下
1 2 | @DateTimeFormat(pattern = "yyyy-MM-dd") private Date createTime; |
2、如果我们只负责web层的开发,就需要在controller中加入数据绑定:
1 2 3 4 5 | @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); //true:允许输入空值,false:不能为空值 |
3、可以在系统中加入一个全局类型转换器
实现转换器
1 2 3 4 5 6 7 8 9 10 11 12 | public class DateConverter 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) { e.printStackTrace(); } return null; } |
进行配置:
1 2 3 4 5 6 7 | <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.doje.XXX.web.DateConverter" /> </list> </property> </bean> |
1 | <mvc:annotation-driven conversion-service="conversionService" /> |
4、如果将日期类型转换为String在页面上显示,需要配合一些前端的技巧进行处理。
5、SpringMVC使用@ResponseBody返回json时,日期格式默认显示为时间戳。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Component("customObjectMapper") public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() { CustomSerializerFactory factory = new CustomSerializerFactory(); factory.addGenericMapping(Date.class, new JsonSerializer<Date>() { @Override public void serialize(Date value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException, JsonProcessingException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); jsonGenerator.writeString(sdf.format(value)); } }); this.setSerializerFactory(factory); } } |
配置如下:
1 2 3 4 5 6 7 | <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="objectMapper" ref="customObjectMapper"></property> </bean> </mvc:message-converters> </mvc:annotation-driven> |
6、date类型转换为json字符串时,返回的是long time值,如果需要返回指定的日期的类型的get方法上写上@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") ,即可将json返回的对象为指定的类型。
1 2 3 4 5 | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") public Date getCreateTime() { return this.createTime; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
通过注解来协助SpringMVC处理日期在前后端的传递问题
从前端向后端传递日期:
@DateTimeFormat(pattern="yyyy-MM-dd")
前台向后台传递字符串类型的日期参数时,需要通过此注解将字符串解析成日期类型,其中日期格式可以根据需要进行设置。
例子:如果后台接收的createDate为Java.util.Date类型,但前台传递过来的是2016-05-23,那么此时我们需要使用@DateTimeFormat注解来修饰createDate字段,否则SpringMVC认为传递过来的是字符串与日期类型不匹配而报400错误(HTTP Status 400 The request sent by the client was syntactically incorrect)。
从后端向前端传递日期:
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
SpringMVC向前端返回json格式的数据时,日期类型默认返回时间戳,那么我们可以通过此注解将时间返回为固定格式的字符串。
使用此注解需要引入一下jar包(需要特别注意的是jackson最新的版本对此功能不兼容,因此建议选择2.6.1或者以下的版本)
- <dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-mapper-asl</artifactId>
- <version>1.9.13</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.6.1</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.6.1</version>
- </dependency>