• Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则


    1、创建一个类来实现AnnotationFormatterFactory接口

    代码:

    package com.oukele.CustomAnnotation;
    
    import com.oukele.model.CardId;
    import org.springframework.format.AnnotationFormatterFactory;
    import org.springframework.format.Parser;
    import org.springframework.format.Printer;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class MyFormatterAnnotation implements AnnotationFormatterFactory<FormId> {
        @Override
        public Set<Class<?>> getFieldTypes() {
            HashSet<Class<?>> types = new HashSet<>();
            types.add(CardId.class);
            return types;
        }
        @Override
        public Printer<?> getPrinter(FormId annotation, Class<?> fieldType) {
            return null;
        }
    
        @Override
        public Parser<?> getParser(FormId annotation, Class<?> fieldType) {
            return getFormatter(annotation);
        }
        private MyFormatter getFormatter(FormId annotation){
            MyFormatter myFormatter = new MyFormatter();
            //获取注解的值,并赋值
            myFormatter.setLanguage(annotation.value());
            return myFormatter;
        }
    
    }
    View Code

    通过实现Formatter接口自定义自已的规则

    代码:

    package com.oukele.CustomAnnotation;
    
    import com.oukele.model.CardId;
    import org.springframework.format.Formatter;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    public class MyFormatter implements Formatter<CardId> {
        //字段
        private String language;
    //    输出
        @Override
        public String print(CardId object, Locale locale) {
            return null;
        }
    //  转换
        @Override
        public CardId parse(String text, Locale locale) throws ParseException {
            //获取传入的身份证号
            //然后截取对应的数字,给CardId的省份、出生日期、性别 赋值
            return new CardId(getProvince(text),getBirth(text),getSex(text));
        }
    
        private String getProvince(String car){
            return "暂无数据";
        }
    
        private Date getBirth(String car) throws ParseException {
            return new SimpleDateFormat("yyyyMMdd").parse(car.substring(6, 14));
        }
    
        private String getSex(String car) {
    
            if( language == null){
                // 17: 偶数 女,奇数 男
                return car.charAt(16) % 2 == 0 ? "女" : "男";
            }else{
                return  car.charAt(16) % 2 == 0 ? "grill" : "boy";
            }
    
        }
    
        public String getLanguage() {
            return language;
        }
    
        public void setLanguage(String language) {
            this.language = language;
        }
    }
    View Code

     如何实现自定义的规则(Formatter)的地址:https://www.cnblogs.com/oukele/p/10042607.html

    FormId注解代码:

    package com.oukele.CustomAnnotation;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FormId {
        String value() default "";
    }
    CardId类的代码:
    package com.oukele.model;
    
    import java.util.Date;
    
    
    public class CardId {
        //身份证
        private String info;
        //省份
        private String Province;
        //出生日期
        private Date birthday;
        //性别
        private String sex;
    
        public CardId(String province, Date birthday, String sex) {
            Province = province;
            this.birthday = birthday;
            this.sex = sex;
        }
    
        public String getInfo() {
            return info;
        }
    
        public void setInfo(String info) {
            this.info = info;
        }
    
        public String getProvince() {
            return Province;
        }
    
        public void setProvince(String province) {
            Province = province;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    }
    View Code
    Controller层代码:

    注意:要使用自定义的类型转换器要在(比如 在spring-web配置文件 )注册,并启用。
    注册:

    启用:

     运行结果:
     
    浏览器显示的结果:



                   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    有多努力就有多幸运。 

  • 相关阅读:
    10 行 Python 代码,批量压缩图片 500 张,简直太强大了
    听说苏州是互联网的荒漠,真的吗?
    sum() 函数性能堪忧,列表降维有何良方?
    len(x) 击败 x.len(),从内置函数看 Python 的设计思想
    如何给列表降维?sum()函数的妙用
    Shell脚本关于循环的一些总结
    大技霸教你远程执行Linux脚本和命令
    老板对我说,你要是能找出公司里摸鱼的人,我就给你涨薪!于是我写了两个脚本……
    Linux 命令行下搜索工具大盘点,效率提高不止一倍!
    饿了么总监分享:我是如何完成从程序员到管理层的蜕变?
  • 原文地址:https://www.cnblogs.com/oukele/p/10044294.html
Copyright © 2020-2023  润新知