美文网首页Java学习笔记Spring Boot程序员
spring-boot前端参数单位转换

spring-boot前端参数单位转换

作者: nul1 | 来源:发表于2017-02-28 20:00 被阅读2983次

    前端时间单位用的是unix时间戳,单位秒,而java后端用的是Date类型。
    在request请求时,如何把前端的时间戳类型优雅的转换为后端的Date类型呢。

    如果你想在response时,把后端的Date类型转换到前端的时间戳类型
    可以看这篇文章java中JsonSerializer用法,前后端单位转换必备

    这里我使用的是SpringBoot框架。

    Controller代码

        @RequestMapping(value = "/add", method = RequestMethod.POST)
        public Result add(@Valid OrderForm form,
                          BindingResult bindingResult) {
            if (bindingResult.hasErrors()) {
            
            }
    

    OrderForm对象

    @Data
    public class OrderForm {
    
        private String id;
    
        private String userName;
        
        private Date addTime;
    }
    

    这时,如果直接传addTime=1488264066是会报错的,提示类型不正确。
    但如果你把addTime类型改成Long就可以

    @Data
    public class OrderForm {
    
        private String id;
    
        private String userName;
        
        private Long addTime;
    }
    

    说明spring已经帮我们做了String到Long的转换,但是没有做转换到Date类型。
    我们来扩展即可。

    在src/java/下建一个名字为bind的包。
    下面放这3个java文件

    /**
    * 扩展类型转换
    */
    public class CustomDateEditor extends PropertyEditorSupport {
    
        /**
         * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
         */
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            setValue(new Date(Long.decode(text)));
        }
    
        /**
         * @see java.beans.PropertyEditorSupport#getAsText()
         */
        @Override
        public String getAsText() {
            Date value = (Date) getValue();
            return (value != null ? String.valueOf(TimeUnit.MILLISECONDS.toSeconds(value.getTime())) : "");
        }
    
    }
    
    /**
    * 扩展web初始化的配置
    */
    public class CustomDateWebBindingInitializer implements WebBindingInitializer {
    
        /**
         * @see org.springframework.web.bind.support.WebBindingInitializer#initBinder(org.springframework.web.bind.WebDataBinder,
         *      org.springframework.web.context.request.WebRequest)
         */
        @Override
        public void initBinder(WebDataBinder binder, WebRequest request) {
            binder.registerCustomEditor(Date.class, new CustomDateEditor());
        }
    
    }
    
    /**
    * 让配置在request请求时生效
    */
    @Configuration
    public class CustomDateEditorConfiguration {
    
        @Autowired
        public void setWebBindingInitializer(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
            requestMappingHandlerAdapter.setWebBindingInitializer(new CustomDateWebBindingInitializer());
        }
    }
    

    配置好后,就可以接收到Date类型的内容了,全局生效。

    相关文章

      网友评论

        本文标题:spring-boot前端参数单位转换

        本文链接:https://www.haomeiwen.com/subject/tkhfgttx.html