springMVC接收日期类型参数的自定义转换

系统管理员 2022-06-12 00:07 395阅读 0赞

springMVC接收日期类型参数的自定义转换

​ 一般类型的参数,都会自动实现转换,比如下面的 private Long id; private String userName; private BigDecimal userSalary; 但是时间类型没有对应转换规则的话,服务器就会报错。

  1. public class User {
  2. private Long id;
  3. private String userName;
  4. private BigDecimal userSalary;
  5. private Date createTime;
  6. // getter、setter
  7. }

实现spring提供的Converter接口,自定义类型转换的处理。

Converter

  1. import org.springframework.core.convert.converter.Converter;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. /** * Created by susq on 2017-7-10. */
  6. public class DateConvert implements Converter<String, Date> {
  7. @Override
  8. public Date convert(String stringDate) {
  9. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
  10. Date d = null;
  11. try {
  12. d = simpleDateFormat.parse(stringDate);
  13. } catch (ParseException e) {
  14. e.printStackTrace();
  15. }
  16. return d;
  17. }
  18. }

在spring配置文件中注册自定义的转换bean

  1. <bean id="dateConvert" class="com.susq.springbegin.utils.DateConvert"/>
  2. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  3. <property name="converters">
  4. <set>
  5. <ref bean="dateConvert"/>
  6. </set>
  7. </property>
  8. </bean>
  9. <mvc:annotation-driven conversion-service="conversionService"/>

Controller中如下。

  1. @RequestMapping(value = "/api/users/testParam")
  2. public void testparam(User vo) {
  3. System.out.println(vo.getId());
  4. System.out.println(vo.getUserName());
  5. System.out.println(vo.getCreateTime());
  6. System.out.println(vo.getUserSalary());
  7. }

请求http://localhost:8080/api/users/testParam?userName=susq&Id=1&userPwd=123456&createTime=20170710&isDelete=1&userSalary=10000.123145 。输出

  1. 1
  2. susq
  3. 123456
  4. Mon Jul 10 00:00:00 CST 2017
  5. 1
  6. 10000.123145

也可以实现Formatter, Formatter是一类特殊的Converter,专门处理字符串的转换

类似于Converter, 修改实现和配置文件即可

  1. public class DateConvert implements Formatter<Date> {
  2. @Override
  3. public Date parse(String s, Locale locale) throws ParseException {
  4. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
  5. Date d = null;
  6. try {
  7. d = simpleDateFormat.parse(s);
  8. } catch (ParseException e) {
  9. e.printStackTrace();
  10. }
  11. return d;
  12. }
  13. @Override
  14. public String print(Date date, Locale locale) {
  15. return null;
  16. }
  17. }
  18. <bean id="dateConvert" class="com.susq.springbegin.utils.DateConvert"/>
  19. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  20. <property name="formatters">
  21. <set>
  22. <ref bean="dateConvert"/>
  23. </set>
  24. </property>
  25. </bean>
  26. <mvc:annotation-driven conversion-service="conversionService"/>

最方便的方式

通过第三方jar包提供好的转换功能,比如使用jackson. 代码中在对应的类的Date类型的属性上加上JsonFormat注解,接口接收或者返回时间类型的时候都会进行自动转换。但是要注意,不指定时区的时候,会和北京时间差8个小时。如果要用北京时间,增加一个属性,timezone=”GMT+8” ,因为我们是东八区(北京时间)

  1. package cn.com.servyou.hs.fp.jxgl.model;
  2. import com.fasterxml.jackson.annotation.JsonFormat;
  3. import lombok.Getter;
  4. import lombok.Setter;
  5. import lombok.ToString;
  6. import java.io.Serializable;
  7. import java.math.BigDecimal;
  8. import java.util.Date;
  9. @Getter
  10. @Setter
  11. @ToString
  12. public class InInvoiceAcquireStatus implements Serializable {
  13. private Long total;
  14. private BigDecimal price;
  15. /** * 上次获取时间 */
  16. @JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
  17. private Date acquireTime;
  18. }

发表评论

表情:
评论列表 (有 0 条评论,395人围观)

还没有评论,来说两句吧...

相关阅读