首页 > 其他分享 >数据前置参数类型转换@InitBinder、Formatter<?>、Converter<?>的使用

数据前置参数类型转换@InitBinder、Formatter<?>、Converter<?>的使用

时间:2024-01-20 22:07:21浏览次数:25  
标签:类型转换 InitBinder Converter simpleDateFormat public Date date Formatter class


前言:在很多时候我们在进行调用接口的时候,传入的参数类型不是指定的特别明确(或者是不能进行自动类型转换),会导致调用接口失败的情况出现,如果我们在调用接口之前进行数据格式化,手动进行数据类型转换,那么就不会出现调用接口失败的情况出现了。这些注解无非也就是做这些工作的。

下面列举工作绝大部分用到的场景

接口中的入参为book,其中book有这几个属性,且提供get、set、tostring方法,如果前端传过来的date的这个属性是一个字符串,但是后端是用Date类型接收的,那么在调用接口的时候会报错。

数据前置参数类型转换@InitBinder、Formatter<?>、Converter<?>的使用_java

int id;
    String name;
    Date date;
@ResponseBody
    @RequestMapping(value = "/bookDo", produces = "application/json"
            , consumes = "application/x-www-form-urlencoded",
            method = RequestMethod.POST)
    public book bookDo(book book) {
        return book;
    }
    @RequestMapping(value = "/date",
            method = RequestMethod.POST)
    public String date(Date date, Model model) {
        model.addAttribute("date", date);
        return "book";
    }

解决办法一(@DateTimeFormat+@JsonFormat)

@DateTimeFormat:指定前端传过来的date的格式化标准(注意前端测试数据别乱写!)
@JsonFormat:指定输出的date格式,由于格式化date是按照国际化标准时间算的,转换成中国时间需要加8

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(
            pattern = "yyyy-MM-dd HH:mm:ss",
            timezone = "GMT+8"
    )
    Date date;

缺点:如果有很多个类都需要进行date类型转换,每个实体类都要加这些注解,很麻烦!

解决办法二(@InitBinder+WebDataBinder )

作用:在数据绑定的时候把字符串格式化成Date类型的date,并且不对id绑定,即使前端传了id值也接收不到了哦!(WebDataBinder里面还有一些其他的方法,读者可以自行测试)

/**
 * @author 张子行
 * @class
 */
   @InitBinder
    public void bind(WebDataBinder webDataBinder) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(simpleDateFormat, true));
        webDataBinder.setDisallowedFields("id");
    }

缺点:只能对当前的controller起作用,如果好多controller需要日期格式话呢?每个controller都加上这个东西也是很麻烦!

优化办法二(巧用extends特性 )

让所有需要日期转换的都extends这个类,代码量又小一点了。

/**
 * @author 张子行
 * @class
 */
public class baseController {
    @InitBinder
    public void bind(WebDataBinder webDataBinder) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(simpleDateFormat, true));
        webDataBinder.setDisallowedFields("id");
    }
}

解决办法三(Formatter)

通过实现Formatter接口实现自己的日期格式化逻辑,并且加入到容器内,其中的Locale可以参考国际化解析

/**
 * @author 张子行
 * @class
 */
@Component
public class myDateFormatter implements Formatter<Date> {
    private SimpleDateFormat simpleDateFormat;
    public myDateFormatter() {
        simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
    /**
     * @param
     * @method 日期接收格式
     */
    @Override
    public Date parse(String s, Locale locale) throws ParseException {
        return simpleDateFormat.parse(s);
    }
    /**
     * @param
     * @method 日期对外输出格式
     */
    @Override
    public String print(Date date, Locale locale) {
        return simpleDateFormat.format(date);
    }
}

另外添加Formatter的方式有很多,通过实现WebMvcConfigurer 接口进行相关的mvc扩展配置,来添加Formatter也是可以的

/**
 * @author 张子行
 * @class
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    /**
     * @method 添加Formatter
     * @param
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //registry.addConverter(new myDateConverter());
        registry.addFormatter(new myDateFormatter());

    }
    /**
     * @method 添加视图控制器
     * @param
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

    }
}

解决办法四(Converter)

和Formatter接口使用上差不多,但是更加强大,可转换的东西也更广。之后加@Component或者注册Converter

/**
 * @author 张子行
 * @class
 */
 @Component
public class myDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = null;
        try {
            parse = simpleDateFormat.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;

    }
}

效果

数据传给后端在做显示给前端

数据前置参数类型转换@InitBinder、Formatter<?>、Converter<?>的使用_spring_02

扩展

如果前端传的是字符串,后端用boolean 接收,咋办呢?同理写Formatter

@RequestMapping(value = "/boolean",
            method = RequestMethod.POST)
    public String date2(boolean b, Model model) {
        model.addAttribute("boolean", b);
        return "book";
    }

只要调用这个接口,传过来的字符串是 {“是”, “嗯”}中的任意一个,那么都为true

@Component
public class myBooleanFormatter implements Formatter<Boolean> {
    private final String[] data = {"是", "嗯"};


    @Override
    public Boolean parse(String s, Locale locale) throws ParseException {
        return Arrays.asList(data).contains(s);
    }

    @Override
    public String print(Boolean aBoolean, Locale locale) {
        return aBoolean ? "true" : "false";
    }
}

测试代码读者觉着不错可以点个星星


标签:类型转换,InitBinder,Converter,simpleDateFormat,public,Date,date,Formatter,class
From: https://blog.51cto.com/u_16414043/9346277

相关文章

  • 类型转换
    类型转换java是强类型语言,所以进行有些运算的时候,需要用到类型转换低---------------------------------->高byte,short,char-->int-->long-->float-->doubleinti=128;byteb=(byte)i;//内存溢出System.out.println(i);//128System.out.println(b);//-128//强制......
  • C# 数据类型与类型转换:包含教程与示例
    C#数据类型C#中的变量必须是指定的数据类型:intmyNum=5;//整数(整数)doublemyDoubleNum=5.99D;//浮点数charmyLetter='D';//字符boolmyBool=true;//布尔stringmyText="Hello";//字符串数据类型指定了变量值的......
  • C# 数据类型与类型转换:包含教程与示例
    C#数据类型C#中的变量必须是指定的数据类型:intmyNum=5;//整数(整数)doublemyDoubleNum=5.99D;//浮点数charmyLetter='D';//字符boolmyBool=true;//布尔stringmyText="Hello";//字符串数据类型指定了变量值......
  • C语言——函数指针类型转换
    昨天为了避免跨层调用API搞了个回调函数,用了函数指针,因为参数类型的问题总是编译报错,今天就看了两篇博文学习学习,顺便做做笔记。其实正常来讲只要把函数指针的参数个数、类型和返回值这些函数指针的标签或者说是属性写对了的话就不会有社么问题,但我也不知道怎么着就会报......
  • instanceof 和类型转换
    注意点父类引用指向子类的对象把子类转换为父类,向上转型;把父类转换为子类,向下转型;强制转换方便方法的调用,减少重复的代码!简洁封装、继承、多态!抽象类,接口快捷键补充语句  举例转换类型之后使用方法 输出结果 这样改写,输出结果一样 代码//J......
  • VMware Converter 服务无法启动
    问题:安装ConverterServer或者往目标端推送Agent报错,Agent、Server、Work服务无法启动。涉及版本:6.2及以上原因:从Converter6.2版本开始,在安装或推送agent时,目标端必须联网验证证书,否则服务无法启动。解决方法:联网时安装。服务启动后可选择是否要断开网络。......
  • 数据类型转换&表达式&运算符总结
    总结数据类型转换概念:将数据从一种格式或结构转换为另一种格式或结构的过程。作用:节约内存空间将一些类型转换为项目所需要的类型类型转换分类自动隐式转换定义:将小的数据类型转换大的数据类型注意事项:在Java中,boolean类型与所有其他7种类型都不能......
  • 【类型转换】使用c#实现简易的类型转换(Emit,Expression,反射)
    引言哈喽。大家好,好久不见,最近遇到了一个场景,就是在FrameWork的asp.netmvc中,有个系统里面使用的是EntityFramework的框架,在这个框架里,提供了一个SqlQuery的方法,这个方法很好用啊,以至于在EFCORE8里面又添加了回来,不过不知道性能怎么样,我遇到的场景是通过SqlQuery查询的时......
  • Numpy中数据类型转换的tips
    在逛StackOverflow时看见一个关于numpy的浮点数据转换的问题比较有趣,现当作tips记录下来。问题原地址我们知道,在numpy中,浮点数据同python本身一样,是用双精度(float64)来存储数据的,而Pytorch或者其他的一些框架中,为了节省运算量,其浮点是用单精度(float32)来存储数据的,因此需要用到数......
  • MappingJackson2HttpMessageConverter使用及jackson配置原理和避坑说明
    转载自:https://blog.csdn.net/Heron22/article/details/109512976MappingJackson2HttpMessageConverter消息转换器创建和生效原理HttpMessageConverters对象的创建使用WebMvcConfigurationSupport配置时转换器创建过程使用WebMvcAutoConfiguration配置时转换器创建过......