zoukankan      html  css  js  c++  java
  • SpringBoot结合Jpa的post为空和时间问题

    解决前台传入参数后台数据null

      @RequestMapping(method = RequestMethod.POST,value = "/insert")
        public void insert(@RequestBody User user){
    
            userService.insert(user);
    

    解决时间报错

    @Table(name = "tt_user")
    public class User {
        public User(){
        }
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String user_name;
        @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
        private Date birthday;
        private String sex;
        private String address;
    }
    

    传入数据含有 yyyy-MM-dd HH:mm:ss时间格式
    不能识别yyyy-MM-dd HH:mm:ss类似格式的数据,所以转换失败。

    解决办法有以下几种
    1、1. 采用long时间戳(毫秒时间戳!!!!)如:1537191968000

    2.在传参的对象上加上@JsonFormat注解并且指定时区(此方法治标不治本)
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    3、采用全局处理方式统一处理,推荐这个做法
    重写springboot默认转换

    public class MyDateFormat extends DateFormat {
    
        private DateFormat dateFormat;
    
        private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
    
        public MyDateFormat(DateFormat dateFormat) {
            this.dateFormat = dateFormat;
        }
    
        @Override
        public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
            return dateFormat.format(date, toAppendTo, fieldPosition);
        }
    
        @Override
        public Date parse(String source, ParsePosition pos) {
    
            Date date = null;
    
            try {
    
                date = format1.parse(source, pos);
            } catch (Exception e) {
    
                date = dateFormat.parse(source, pos);
            }
    
            return date;
        }
    
        // 主要还是装饰这个方法
        @Override
        public Date parse(String source) throws ParseException {
    
            Date date = null;
    
            try {
    
                // 先按我的规则来
                date = format1.parse(source);
            } catch (Exception e) {
    
                // 不行,那就按原先的规则吧
                date = dateFormat.parse(source);
            }
    
            return date;
        }
    
        // 这里装饰clone方法的原因是因为clone方法在jackson中也有用到
        @Override
        public Object clone() {
            Object format = dateFormat.clone();
            return new MyDateFormat((DateFormat) format);
        }
    
    
    }
    
    @Configuration
    public class WebConfig {
    
        @Autowired
        private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder;
    
        @Bean
        public MappingJackson2HttpMessageConverter MappingJsonpHttpMessageConverter() {
    
            ObjectMapper mapper = jackson2ObjectMapperBuilder.build();
    
            // ObjectMapper为了保障线程安全性,里面的配置类都是一个不可变的对象
            // 所以这里的setDateFormat的内部原理其实是创建了一个新的配置类
            DateFormat dateFormat = mapper.getDateFormat();
            mapper.setDateFormat(new MyDateFormat(dateFormat));
    
            MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter(
                    mapper);
            return mappingJsonpHttpMessageConverter;
        }
    
    }
    

    测试均有效
    参考链接:https://www.cnblogs.com/oskyhg/p/9665627.html

  • 相关阅读:
    Maven——配置阿里云的镜像仓库
    Eclipse——配置代码提示
    设计模式——一步步实现《单例模式》
    JAVA实现二叉平衡树
    简单设计模式——状态模式 (召唤师峡谷版)
    简单设计模式——观察者模式
    JavaScript获取鼠拖动选中的内容(InMemories笔记)
    图解数据结构——二叉查找树/二叉排序树
    SpringMVC详细笔记(一) —— 几步快速搭建一个SpringMVC程序
    【Java虚拟机10】ClassLoader.getSystemClassLoader()流程简析
  • 原文地址:https://www.cnblogs.com/weidaijie/p/14333759.html
Copyright © 2011-2022 走看看