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;
} }

通过实现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;
}
}

如何实现自定义的规则(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;
}
}
Controller层代码:

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

启用:

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

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

有多努力就有多幸运。 

Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则的更多相关文章

  1. Spring MVC内容协商实现原理及自定义配置【享学Spring MVC】

    每篇一句 在绝对力量面前,一切技巧都是浮云 前言 上文 介绍了Http内容协商的一些概念,以及Spring MVC内置的4种协商方式使用介绍.本文主要针对Spring MVC内容协商方式:从步骤.原理 ...

  2. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  3. spring mvc 基于注解的使用总结

    本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...

  4. 初学 Spring MVC(基于 Spring in Action)

    Spring MVC(Model-View-Controller) 当你看到本博文时,我猜你可能正面临着我已探索过的问题. 同其他博主一样,我先按照书上详细的介绍一下 Spring MVC,也是为了自 ...

  5. 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录

    java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务 ...

  6. Swagger+Spring mvc生成Restful接口文档

    简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...

  7. Spring MVC 基于URL的映射规则(注解版)

    好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了.这次就跟着之前的问题,继续总结下Spring MVC中的小知识. 关于SpringMVC的小demo可以参考这里! url-p ...

  8. Spring MVC基于注解@Controller和@RequestMapping开发的一个例子

    1.创建web项目 2.在springmvc的配置文件中指定注解驱动,配置扫描器 在 Spring MVC 中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC ...

  9. spring mvc 基于注解 配置默认 handlermapping

    spring mvc 是类似于 Struts 的框架.他们都有一个最主要的功能就是URL路由.URL路由能将请求与响应请求处理逻辑的类(在Struts中即是action,在spring mvc 中即是 ...

随机推荐

  1. python-Web-django-富文本编辑器

    views: def gbook(request): '''''' text = request.POST.get('text') soup = BeautifulSoup(text, "h ...

  2. javascript预编译练习(变态篇)

    例1. <!DOCTYPE html> <html> <head> <title></title> </head> <bo ...

  3. AS将一个项目导入到另一个项目中

    需求:有项目A,B.需要将B集成到A中,作为A的一个模块. 方法: 1.将B工程的app下面的build.gradle文字中  apply plugin: 'com.android.applicati ...

  4. alembic的使用

  5. sqlalchemy一对一关系映射

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text ...

  6. [Python3] 034 函数式编程 匿名函数

    目录 函数式编程 Functional Programming 1. 简介 2. 函数 3. 匿名函数 3.1 lambda 表达式也称"匿名函数" 3.2 lambda 表达式的 ...

  7. [转帖]IBM收购红帽价格是多少?是否会形成垄断企业?会存在什么不安因素?

    http://www.techweb.com.cn/it/2019-07-10/2743776.shtml 国产的linux 用centos源的 如何是好呢.. 蓝色巨人IBM官方宣布,已经正式完成对 ...

  8. 自己总结的keepalived的配置流程以及注意事项

    编写背景:上班时领导要求我们团队实现postgresql主备切换的高可用问题,我辅助keepalived的部分,从查资料到实施最后使用,最后编写了这个博客,水平有限,欢迎大家指正 ###postgre ...

  9. 在Ubuntu上安装Hive

    1.下载hive2.3.5 解压缩并改名为hive目录,放到/usr/local下(注意权限) sudo mv apache-hive-2.3.5-bin /usr/local/hive 2.修改目录 ...

  10. Go语言中的数组(九)

    我刚接触go语言的数组时,有点不习惯,因为相对于JavaScript这样的动态语言里的数组,go语言的数组写起来有点不爽. 定义数组 go语言定义数组的格式如下: ]int var 数组名 [数组长度 ...