springMVC接收日期类型参数的自定义转换
一般类型的参数,都会自动实现转换,比如下面的 private Long id; private String userName; private BigDecimal userSalary; 但是时间类型没有对应转换规则的话,服务器就会报错。
public class User {
private Long id;
private String userName;
private BigDecimal userSalary;
private Date createTime;
// getter、setter
}
实现spring提供的Converter接口,自定义类型转换的处理。
Converter
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by susq on 2017-7-10.
*/
public class DateConvert implements Converter<String, Date> {
@Override
public Date convert(String stringDate) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
Date d = null;
try {
d = simpleDateFormat.parse(stringDate);
} catch (ParseException e) {
e.printStackTrace();
}
return d;
}
}
在spring配置文件中注册自定义的转换bean
<bean id="dateConvert" class="com.susq.springbegin.utils.DateConvert"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="dateConvert"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
Controller中如下。
@RequestMapping(value = "/api/users/testParam")
public void testparam(User vo) {
System.out.println(vo.getId());
System.out.println(vo.getUserName());
System.out.println(vo.getCreateTime());
System.out.println(vo.getUserSalary());
}
1
susq
123456
Mon Jul 10 00:00:00 CST 2017
1
10000.123145
也可以实现Formatter, Formatter是一类特殊的Converter,专门处理字符串的转换
类似于Converter, 修改实现和配置文件即可
public class DateConvert implements Formatter<Date> {
@Override
public Date parse(String s, Locale locale) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
Date d = null;
try {
d = simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return d;
}
@Override
public String print(Date date, Locale locale) {
return null;
}
}
<bean id="dateConvert" class="com.susq.springbegin.utils.DateConvert"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<ref bean="dateConvert"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
最方便的方式
通过第三方jar包提供好的转换功能,比如使用jackson. 代码中在对应的类的Date类型的属性上加上JsonFormat注解,接口接收或者返回时间类型的时候都会进行自动转换。但是要注意,不指定时区的时候,会和北京时间差8个小时。如果要用北京时间,增加一个属性,timezone=”GMT+8” ,因为我们是东八区(北京时间)
package cn.com.servyou.hs.fp.jxgl.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Getter
@Setter
@ToString
public class InInvoiceAcquireStatus implements Serializable {
private Long total;
private BigDecimal price;
/**
* 上次获取时间
*/
@JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date acquireTime;
}