第一步:定义注解

PersonFormId:
package com.wbg.maven1128.demo_formatter;

import java.lang.annotation.*;
@Documented
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonFormId {
}

第二步:创建实体类

Person:

package com.wbg.maven1128.demo_formatter;

import java.util.Date;

public class Person {
Date birthday;
String sex;
String province;
public Person() {
} @Override
public String toString() {
return "Person{" +
"birthday='" + birthday + '\'' +
", sex='" + sex + '\'' +
", province='" + province + '\'' +
'}';
} public Person(Date birthday, String sex, String province) {
this.birthday = birthday;
this.sex = sex;
this.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;
} public String getProvince() {
return province;
} public void setProvince(String province) {
this.province = province;
}
}

第三步:创建实现类调用接口Formatter<Person>

PersonFormatter:

package com.wbg.maven1128.demo_formatter;

import org.springframework.format.Formatter;
import java.text.ParseException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map; public class PersonFormatter implements Formatter<Person> { @Override
public String print(Person object, Locale locale) {
return null;
}
@Override
public Person parse(String text, Locale locale) throws ParseException {
if(text.length()!=18){
throw new ParseException("请输入18位身份证",59);
}
else if(text.length()==18&&Verification(text)){ return getPerson(text);
}else {
throw new ParseException("身份证输入错误",59);
}
}
Person getPerson(String text){
Person person=new Person();
Calendar instance = Calendar.getInstance();
int year=Integer.parseInt(text.substring(6,10));
int month=Integer.parseInt(text.substring(10,12))-1;
int date=Integer.parseInt(text.substring(12,14));
instance.set(year,month,date);
person.setBirthday(instance.getTime());
person.setProvince(provinces.get(Integer.parseInt(text.substring(0,2))));
person.setSex(Integer.parseInt(text.substring(16,17))%2==0?"女":"男");
return person;
}
static Map<Integer,String> provinces = new HashMap<Integer, String>(){{
this.put(11,"北京市");
this.put(12,"天津市");
this.put(13,"河北省");
this.put(14,"山西省");
this.put(15,"内蒙古自治区");
this.put(21,"辽宁省");
this.put(22,"吉林省");
this.put(23,"黑龙江省");
this.put(31,"上海市");
this.put(32,"江苏省");
this.put(33,"浙江省");
this.put(34,"安徽省");
this.put(35,"福建省");
this.put(36,"江西省");
this.put(37,"山东省");
this.put(41,"河南省");
this.put(42,"湖北省");
this.put(43,"湖南省");
this.put(44,"广东省");
this.put(45,"广西壮族自治区");
this.put(46,"海南省");
this.put(51,"四川省");
this.put(52,"贵州省");
this.put(53,"云南省");
this.put(54,"西藏自治区");
this.put(50,"重庆市");
this.put(61,"陕西省");
this.put(62,"甘肃省");
this.put(63,"青海省");
this.put(64,"宁夏回族自治区");
this.put(65,"新疆维吾尔自治区");
this.put(83,"台湾地区");
this.put(81,"香港特别行政区");
this.put(82,"澳门特别行政区");
}}; boolean Verification(String text){
text=text.toUpperCase();
String []aa={"7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2"};
String []bb={"1","0","X","9","8","7","6","5","4","3","2"};
int sum=0;
for (int i = 0; i < 17; i++) {
sum+=Integer.parseInt(text.substring(i, 1 + i))*Integer.parseInt(aa[i]);
}
return bb[sum%11].equals(text.substring(17,18));
} }

第四步:调用

MyDataTimeFormatAnnotationFormatterFactory接口AnnotationFormatterFactory<MyDateFormatter>

package com.wbg.maven1128.intface;

import com.wbg.maven1128.entity.Person;
import org.springframework.context.support.EmbeddedValueResolutionSupport;
import org.springframework.format.AnnotationFormatterFactory;
import org.springframework.format.Formatter;
import org.springframework.format.Parser;
import org.springframework.format.Printer; import java.util.*; public class MyDataTimeFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<MyDateTimeFormat> {
private static final Set<Class<?>> FIELD_TYPES;
static {
Set<Class<?>> fieldTypes = new HashSet<Class<?>>(4);
//添加可以使用注解的类型
fieldTypes.add(String.class);
fieldTypes.add(Person.class);
FIELD_TYPES = Collections.unmodifiableSet(fieldTypes);
}
@Override
public Set<Class<?>> getFieldTypes() {
return FIELD_TYPES;
} @Override
public Printer<?> getPrinter(MyDateTimeFormat annotation, Class<?> fieldType) {
return getFormatter(annotation, fieldType);
} @Override
public Parser<?> getParser(MyDateTimeFormat annotation, Class<?> fieldType) {
return getFormatter(annotation, fieldType);
}
protected Formatter<Person> getFormatter(MyDateTimeFormat annotation, Class<?> fieldType) {
MyDateFormatter formatter = new MyDateFormatter();
return formatter;
}
}

第四步:启用注解

    <mvc:default-servlet-handler />
<bean name="factoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="com.wbg.maven1128.demo_formatter.PersonAnnotationFormatter" >
</bean>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="factoryBean"/>

jsp页面:

controller

package com.wbg.maven1128.controller;

import com.wbg.maven1128.demo_formatter.Person;
import com.wbg.maven1128.demo_formatter.PersonFormId;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping("/person")
public class PersonController {
@RequestMapping(value = "/get",produces = "application/json;charset=utf-8")
@ResponseBody
public String getPerson(@RequestParam(value = "pid",required = false)@PersonFormId Person person){
try {
return person.toString();
}catch (Exception e){
System.out.println(e.getMessage());
return e.getMessage();
}
}
@GetMapping
public String index(){
return "person_index";
}
}

最后直接测试

Spring自定义注解(验证身份证+性别+地区)的更多相关文章

  1. spring自定义注解实现登陆拦截器

    1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...

  2. SpringMVC拦截器+Spring自定义注解实现权限验证

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  3. spring - 自定义注解

    本自定义注解的作用:用于控制类方法的调用,只有拥有某个角色时才能调用. java内置注解 1.@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetTy ...

  4. Spring 自定义注解,配置简单日志注解

    java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...

  5. 照虎画猫写自己的Spring——自定义注解

    Fairy已经实现的功能 读取XML格式配置文件,解析得到Bean 读取JSON格式配置文件,解析得到Bean 基于XML配置的依赖注入 所以,理所当然,今天该实现基于注解的依赖注入了. 基于XML配 ...

  6. 使用Spring自定义注解实现任务路由的方法

    在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器 ...

  7. Spring自定义注解扫描的实现

    目标:实现自定义spring自动扫描注解.主要为后期实现分布式服务框架自动注解提供技术支持 技术分析:通过配置组件扫描标签使spring解析标签. 1. JewelScanBeanDefaultPar ...

  8. 2018-02-11 发布 spring 自定义注解(annotation)与 aop获取注解

    知识点: Java自定义注解.spring aop @aspect的使用 首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@Suppres ...

  9. 深入Spring:自定义注解加载和使用

    前言 在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑.特别是开发Web应用时,我们会频繁的定义@Controller,@Service ...

随机推荐

  1. SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心

    目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...

  2. es入门教程

    因为项目可能会用到es保存一些非结构化的数据,并从中检索数据.对es调研了一下 从官网:https://www.elastic.co/downloads下载,解压即安装. 进入解压目录,执行bin目录 ...

  3. java 输出菱形

    package com.demo01; public class Triangle { /** * @param args */ /* * 第一步:规定输出的行数 * 第二步:输出空格 再输出一个星, ...

  4. Codeforces Round #394 (Div. 2)

    前一半是刚刚打完比赛的时候写的……不知为啥手腕有点僵,估计是前一个小时用力过度了吧= = 前四题看着还好,后两题就有点懵逼了……现在还不知道E题的题意到底是啥…… 不管了……还没找着官方题解,贴一下自 ...

  5. Windows核心编程(第5版)----关闭内核对象

    无论怎样创建内核对象,都要向系统指明将通过调用 CloseHandle 来结束对该对象的操作: BOOL CloseHandle(HANDLE hobj); 该函数首先检查调用进程的句柄表,以确保传递 ...

  6. Codeforces Round #411 B. 3-palindrome

    B. 3-palindrome time limit per test 1 second memory limit per test 256 megabytes   In the beginning ...

  7. javax.swing.JComponent 调用顺序

    网上截取的,感觉挺有用,记录下来. http://bbs.csdn.net/topics/310041707 java swing 感觉好复杂啊…………一点都不想用但是作业要用到 >_<; ...

  8. 关于实现XX系统设计时所实现的质量属性战术

    可用性: 1)使用Try-catch对抛出的异常进行处理 2)使用Spring事务管理 易用性: 1)在类似删除相关选项时,弹出提示框,防止误操作 2)在不编辑基本信息时,对其进行折叠或者隐藏 3)提 ...

  9. centos 克隆系统放到别的机器上后出现网卡启动不了的情况

      1. Remove Network Manager from startup Services. #chkconfig NetworkManager off 2. Add Default Net ...

  10. GridControl 应用 z

    DevExpress学习系列(控件篇):GridControl的基本应用 一般属性设置 不显示分组框:Gridview->Option View->Show Group Panel=fal ...