Spring自定义注解(验证身份证+性别+地区)
第一步:定义注解

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自定义注解(验证身份证+性别+地区)的更多相关文章
- spring自定义注解实现登陆拦截器
1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...
- SpringMVC拦截器+Spring自定义注解实现权限验证
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- spring - 自定义注解
本自定义注解的作用:用于控制类方法的调用,只有拥有某个角色时才能调用. java内置注解 1.@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetTy ...
- Spring 自定义注解,配置简单日志注解
java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...
- 照虎画猫写自己的Spring——自定义注解
Fairy已经实现的功能 读取XML格式配置文件,解析得到Bean 读取JSON格式配置文件,解析得到Bean 基于XML配置的依赖注入 所以,理所当然,今天该实现基于注解的依赖注入了. 基于XML配 ...
- 使用Spring自定义注解实现任务路由的方法
在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器 ...
- Spring自定义注解扫描的实现
目标:实现自定义spring自动扫描注解.主要为后期实现分布式服务框架自动注解提供技术支持 技术分析:通过配置组件扫描标签使spring解析标签. 1. JewelScanBeanDefaultPar ...
- 2018-02-11 发布 spring 自定义注解(annotation)与 aop获取注解
知识点: Java自定义注解.spring aop @aspect的使用 首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@Suppres ...
- 深入Spring:自定义注解加载和使用
前言 在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑.特别是开发Web应用时,我们会频繁的定义@Controller,@Service ...
随机推荐
- Ubuntu17.10下编译Openjdk8u
一开始笔者用的系统和软件版本都是最新的,导致编译了好几次都失败,最后找到解决的办法,现在记录一下编译及解决的方法 避免以后忘记 所用操作系统 Ubuntu17.10 所用软件及版本 make 3.8. ...
- [PHP] Oauth授权和本地加密
1.Oauth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方 关键字:appKey appSecre ...
- ComfortColor.xcs
ComfortColor.xcs [comfort color] text=dce2e2text(bold)=dce2e2 magenta=dd3682magenta(bold)=dd3682 whi ...
- csharp: using using System.Web.Script.Serialization read json
using System; using System.Data; using System.Configuration; using System.Collections; using System. ...
- mockjs
首先还是那句话,进来的GodBoy and GoodGirl 不妨看完再离开. 一个走在路上的前端攻城狮-along 一.mock的由来 mock有“愚弄.欺骗”之意,在前端领域,mock可以理解为 ...
- HTML 发表说说 制作方法
==================================================================================================== ...
- Springboot基础知识
1.@RestController注解 Spring4之后新加入的注解,@RestController是@ResponseBody和@Controller的组合注解.(返回json需要@Respons ...
- JDBC mysql驱动
在用JDBC连接MySQL数据库时,需要使用驱动 mysql-connector-java-5.1.41-bin.jar 在本地java应用程序中,只需将jar包导入到项目library中即可, 而在 ...
- 网络协议HTTP TCP/UDP 浏览器缓存 Restful(十)
一 TCP网络协议 1 建立TCP连接:三次握手原则 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三次握手的一部分.客户端把这段连接的序号设定为随机数 A. 服务器端应当为一个合法的SY ...
- JAVA环境变量安装
需配置的系统环境变量参数: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_60 CLASS_PATH: ;%JAVA_HOME%\lib;%JAVA_HOME%\l ...