日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

自定义的注解校验器的实现

發(fā)布時(shí)間:2024/1/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义的注解校验器的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先先學(xué)習(xí)一下注解,注解為我們?cè)诖a中添加信息提供了一種形式化的方法,使得我們?cè)谏院蟮哪硞€(gè)時(shí)刻可以方便地使用這些數(shù)據(jù)。

????在日常的編碼中我們一直都在使用注解,只是沒(méi)有特別關(guān)注過(guò),Java中內(nèi)置了三種注解:@Override,@SuppressWarnings @Deprecated。相信只要學(xué)習(xí)過(guò)Java的同學(xué)一定是見過(guò)這些主角的 。

????如果我們要寫一個(gè)自定義的注解應(yīng)該怎么呢?

????首先需要定義一個(gè)注解標(biāo)注出是自定義的注解

?

Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?CustomerRule.java,?v?0.1?2015年5月29日?下午10:12:16?zhangwei_david?Exp?$?
  • ?*/??
  • @Documented??
  • @Target(ElementType.ANNOTATION_TYPE)??
  • @Retention(RetentionPolicy.RUNTIME)??
  • public?@interface?CustomerValidator?{??
  • ??
  • }??
  • ??????這個(gè)注解中沒(méi)有任何內(nèi)容,屬于標(biāo)記注解

    ?

    ?

    ??? 自定義?日期類型校驗(yàn)器的注解

    ?

    Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?Date.java,?v?0.1?2015年5月29日?下午10:00:20?zhangwei_david?Exp?$?
  • ?*/??
  • @Documented??
  • @Target(ElementType.FIELD)??
  • @Retention(RetentionPolicy.RUNTIME)??
  • @CustomerValidator??
  • public?@interface?DateString?{??
  • ????String?pattern()?default?"yyyy-MM-dd?HH:mm:ss";??
  • ??
  • ????String?errorCode()?default?"must?date";??
  • ??
  • ????String?message()?default?"must?be?date?pattern";??
  • }??
  • ?

    ?

    ?

    , @Target是用來(lái)定義該注解將可以應(yīng)用在什么地方,FIELD表示該注解應(yīng)用在一個(gè)屬性上,@Rectetion?用來(lái)定義該注解在哪一個(gè)級(jí)別可以使用 RUNTIME表示運(yùn)行時(shí)。

    ?????String pattern() default "yyyy-MM-dd HH:mm:ss"?表示如果不指定pattern這個(gè)值的時(shí)候?qū)⒎祷啬J(rèn)值“yyyy-MM-dd HH:mm:ss” 。

    ?

    ???有了自己的注解,那么就需要一個(gè)注解的處理器,定義一個(gè)處理器接

    ?

    Java代碼??
  • /**?
  • ?*自定義注解處理器接口?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?CustomerValidatorRule.java,?v?0.1?2015年5月30日?上午8:51:52?zhangwei_david?Exp?$?
  • ?*/??
  • public?interface?CustomerValidatorRule?{??
  • ??
  • ????/**?
  • ?????*?判斷是否支持該注解?
  • ?????*?
  • ?????*?@param?annotation?
  • ?????*?@param?property?
  • ?????*?@return?
  • ?????*/??
  • ????public?boolean?support(Annotation?annotation);??
  • ??
  • ????/**?
  • ?????*??校驗(yàn)處理?
  • ?????*??
  • ?????*?
  • ?????*?@param?annotation?
  • ?????*?@param?field?
  • ?????*?@param?errors?
  • ?????*/??
  • ????public?void?valid(Annotation?annotation,?Object?object,?Field?field,?Errors?errors)??
  • ????????????throws?Exception;??
  • }??
  • ?

    ?

    ?

    Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?AbastractCustomerValidatorRule.java,?v?0.1?2015年5月30日?上午11:22:19?zhangwei_david?Exp?$?
  • ?*/??
  • public?abstract?class?AbastractCustomerValidatorRule?implements?CustomerValidatorRule?{??
  • ??
  • ????/**?
  • ?????*?@see?com.cathy.core.service.annotation.rule.CustomerValidatorRule#support(java.lang.annotation.Annotation)?
  • ?????*/??
  • ????public?abstract?boolean?support(Annotation?annotation);??
  • ??
  • ????/**?
  • ?????*?@param?<T>?
  • ?????*?@see?com.cathy.core.service.annotation.rule.CustomerValidatorRule#valid(java.lang.annotation.Annotation,?java.lang.reflect.Field,?org.springframework.validation.Errors)?
  • ?????*/??
  • ????public?void?valid(Annotation?annotation,?Object?target,?final?Field?field,?final?Errors?errors)??
  • ???????????????????????????????????????????????????????????????????????????????????????????????????throws?Exception?{??
  • ????????preHandle(annotation,?target,?field,?errors);??
  • ????????PropertyDescriptor?propertyDescriptor?=?BeanUtils.getPropertyDescriptor(target.getClass(),??
  • ????????????field.getName());??
  • ????????Method?reader?=?propertyDescriptor.getReadMethod();??
  • ????????Object?property?=?reader.invoke(target);??
  • ????????validProperty(annotation,?property,?new?PostHandler()?{??
  • ??
  • ????????????public?void?postHanle(String?errorCode,?String?message)?{??
  • ????????????????errors.rejectValue(field.getName(),?errorCode,?message);??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??
  • ????public?static?interface?PostHandler?{??
  • ????????public?void?postHanle(String?errorCode,?String?message);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?
  • ?????*/??
  • ????private?void?preHandle(Annotation?annotation,?Object?target,?Field?field,?Errors?errors)?{??
  • ????????Assert.notNull(target);??
  • ????????Assert.notNull(annotation);??
  • ????????Assert.notNull(errors);??
  • ????????Assert.notNull(field);??
  • ????}??
  • ??
  • ????public?abstract?void?validProperty(Annotation?annotation,?Object?property,??
  • ???????????????????????????????????????PostHandler?postHandler);??
  • ??
  • }??
  • ?

    ?

    ?

    ?

    Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?DateValidatorRule.java,?v?0.1?2015年5月30日?上午11:17:09?zhangwei_david?Exp?$?
  • ?*/??
  • @CustomerRule??
  • public?class?DateValidatorRule?extends?AbastractCustomerValidatorRule?{??
  • ??
  • ????/**?
  • ?????*?@see?com.cathy.core.service.annotation.rule.CustomerValidatorRule#support(java.lang.annotation.Annotation,?java.lang.Object)?
  • ?????*/??
  • ????@Override??
  • ????public?boolean?support(Annotation?annotation)?{??
  • ????????return?annotation?instanceof?DateString;??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?@see?com.cathy.core.service.annotation.rule.AbastractCustomerValidatorRule#validProperty(java.lang.annotation.Annotation,?java.lang.Object)?
  • ?????*/??
  • ????@Override??
  • ????public?void?validProperty(Annotation?annotation,?Object?property,?PostHandler?postHandler)?{??
  • ????????DateString?ds?=?(DateString)?annotation;??
  • ????????if?(parse(ds.pattern(),?(String)?property)?==?null)?{??
  • ????????????postHandler.postHanle(ds.errorCode(),?ds.message());??
  • ????????}??
  • ????}??
  • ??
  • ????private?Date?parse(String?pattern,?String?property)?{??
  • ????????try?{??
  • ????????????SimpleDateFormat?sdf?=?new?SimpleDateFormat(pattern);??
  • ????????????return?sdf.parse(property);??
  • ????????}?catch?(ParseException?e)?{??
  • ????????????//do?noting??
  • ????????}??
  • ????????return?null;??
  • ????}??
  • }??
  • ?

    ?

    ???這樣我們就有了一個(gè)注解處理器,為了方便擴(kuò)展,該處使用注解的方式加載定義的注解處理器,這就需要定義一個(gè)標(biāo)注是自定義的注解處理器的注解。

    ?

    ?

    Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?CustomerValidatorRule.java,?v?0.1?2015年5月30日?下午12:51:20?zhangwei_david?Exp?$?
  • ?*/??
  • @Documented??
  • @Target(ElementType.TYPE)??
  • @Retention(RetentionPolicy.RUNTIME)??
  • @Component??
  • public?@interface?CustomerRule?{??
  • ??
  • }??
  • ?

    ?

    ?

    Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?CustomerValidatorProcesser.java,?v?0.1?2015年5月30日?下午12:38:33?zhangwei_david?Exp?$?
  • ?*/??
  • public?class?CustomerValidatorConfig?implements?ApplicationContextAware?{??
  • ??
  • ????private?Map<Annotation,?CustomerValidatorRule>?rules???????????????????=?new?ConcurrentHashMap<Annotation,?CustomerValidatorRule>();??
  • ??
  • ????Map<String,?Object>????????????????????????????customerValidationRules?=?null;??
  • ??
  • ????/**?
  • ?????*?@see?org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)?
  • ?????*/??
  • ????public?void?setApplicationContext(ApplicationContext?applicationContext)?throws?BeansException?{??
  • ????????customerValidationRules?=?applicationContext??
  • ????????????????.getBeansWithAnnotation(CustomerRule.class);??
  • ????????System.out.println(customerValidationRules);??
  • ????}??
  • ??
  • ????private?CustomerValidatorRule?findFormMap(Annotation?annotation)?{??
  • ????????for?(Entry<String,?Object>?entry?:?customerValidationRules.entrySet())?{??
  • ????????????if?(entry.getValue()?!=?null??
  • ????????????????????&&?((CustomerValidatorRule)?entry.getValue()).support(annotation))?{??
  • ????????????????return?(CustomerValidatorRule)?entry.getValue();??
  • ????????????}??
  • ????????}??
  • ????????return?null;??
  • ????}??
  • ??
  • ????public?CustomerValidatorRule?findRule(Annotation?annotation)?{??
  • ????????CustomerValidatorRule?customerValidatorRule?=?null;??
  • ????????if?(!rules.containsKey(annotation))?{??
  • ????????????CustomerValidatorRule?cvr?=?findFormMap(annotation);??
  • ????????????if?(cvr?!=?null)?{??
  • ????????????????rules.put(annotation,?cvr);??
  • ????????????}??
  • ????????????customerValidatorRule?=?cvr;??
  • ????????}??
  • ????????customerValidatorRule?=?rules.get(annotation);??
  • ????????return?customerValidatorRule;??
  • ????}??
  • }??
  • ?通過(guò)實(shí)現(xiàn)ApplicationContextAware接口,從上下文中自動(dòng)加載處理器。 Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?CustomerValidatorFactory.java,?v?0.1?2015年5月30日?下午1:03:56?zhangwei_david?Exp?$?
  • ?*/??
  • @Component??
  • public?class?CustomerValidatorFactory?implements?Validator?{??
  • ??
  • ????@Autowired??
  • ????private?CustomerValidatorConfig?customerValidatorConfig;??
  • ??
  • ????/**?
  • ?????*?@see?org.springframework.validation.Validator#supports(java.lang.Class)?
  • ?????*/??
  • ????public?boolean?supports(Class<?>?clazz)?{??
  • ????????return?true;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?@see?org.springframework.validation.Validator#validate(java.lang.Object,?org.springframework.validation.Errors)?
  • ?????*/??
  • ????public?void?validate(Object?target,?Errors?errors)?{??
  • ????????Assert.notNull(target);??
  • ????????Assert.notNull(errors);??
  • ????????List<Field>?fileds?=?getFields(target.getClass());??
  • ????????for?(Field?field?:?fileds)?{??
  • ????????????Annotation[]?annotations?=?field.getAnnotations();??
  • ????????????for?(Annotation?annotation?:?annotations)?{??
  • ????????????????if?(annotation.annotationType().getAnnotation(CustomerValidator.class)?!=?null)?{??
  • ????????????????????try?{??
  • ????????????????????????CustomerValidatorRule?customerValidatorRule?=?customerValidatorConfig??
  • ????????????????????????????.findRule(annotation);??
  • ????????????????????????if?(customerValidatorRule?!=?null)?{??
  • ????????????????????????????customerValidatorRule.valid(annotation,?target,?field,?errors);??
  • ????????????????????????}??
  • ????????????????????}?catch?(Exception?e)?{??
  • ????????????????????????e.printStackTrace();??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?獲取class的fields。?
  • ?????*?
  • ?????*?@param?clazz?bean所在的class?
  • ?????*?@return?
  • ?????*/??
  • ????private?List<Field>?getFields(Class<??extends?Object>?clazz)?{??
  • ????????//?聲明Field數(shù)組??
  • ????????List<Field>?fields?=?new?ArrayList<Field>();??
  • ??
  • ????????//?如果class類型不為空??
  • ????????while?(clazz?!=?null)?{??
  • ????????????//?添加屬性到屬性數(shù)組??
  • ????????????Collections.addAll(fields,?clazz.getDeclaredFields());??
  • ????????????clazz?=?clazz.getSuperclass();??
  • ????????}??
  • ????????return?fields;??
  • ????}??
  • ??
  • }??
  • ?

    ?

    使用自定義校驗(yàn)處理器: Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?MyTest.java,?v?0.1?2014年12月31日?下午9:25:49?zhangwei_david?Exp?$?
  • ?*/??
  • @RunWith(SpringJUnit4ClassRunner.class)??
  • @ContextConfiguration(locations?=?"classpath:spring.xml")??
  • public?class?DemoTest?{??
  • ??
  • ????@Autowired??
  • ????private?Validator?customerValidatorFactory;??
  • ??
  • ????@Test??
  • ????public?void?helloTest()?{??
  • ????????Form?form?=?new?Form();??
  • ????????form.setCurrent("2015?11?11");??
  • ????????BindException?errors?=?new?BindException(form,?"target");??
  • ????????customerValidatorFactory.validate(form,?errors);??
  • ????????System.out.println(errors.getFieldErrors());??
  • ????}??
  • ??
  • }??
  • ? Java代碼??
  • /**?
  • ?*?
  • ?*?@author?zhangwei_david?
  • ?*?@version?$Id:?Form.java,?v?0.1?2015年5月30日?下午4:04:06?zhangwei_david?Exp?$?
  • ?*/??
  • public?class?Form?{??
  • ????@DateString??
  • ????private?String?current;??
  • ??
  • ????/**?
  • ?????*?Getter?method?for?property?<tt>current</tt>.?
  • ?????*?
  • ?????*?@return?property?value?of?current?
  • ?????*/??
  • ????public?String?getCurrent()?{??
  • ????????return?current;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Setter?method?for?property?<tt>current</tt>.?
  • ?????*?
  • ?????*?@param?current?value?to?be?assigned?to?property?current?
  • ?????*/??
  • ????public?void?setCurrent(String?current)?{??
  • ????????this.current?=?current;??
  • ????}??
  • ??
  • }??
  • ?運(yùn)行的結(jié)果是: Java代碼??
  • 五月?30,?2015?8:21:35?下午?org.springframework.test.context.TestContextManager?retrieveTestExecutionListeners??
  • 信息:?@TestExecutionListeners?is?not?present?for?class?[class?com.cathy.core.service.annotation.HelloServiceTest]:?using?defaults.??
  • 五月?30,?2015?8:21:36?下午?org.springframework.beans.factory.xml.XmlBeanDefinitionReader?loadBeanDefinitions??
  • 信息:?Loading?XML?bean?definitions?from?class?path?resource?[spring.xml]??
  • 五月?30,?2015?8:21:36?下午?org.springframework.context.support.GenericApplicationContext?prepareRefresh??
  • 信息:?Refreshing?org.springframework.context.support.GenericApplicationContext@f7aae2:?startup?date?[Sat?May?30?20:21:36?CST?2015];?root?of?context?hierarchy??
  • 五月?30,?2015?8:21:36?下午?org.springframework.beans.factory.support.DefaultListableBeanFactory?preInstantiateSingletons??
  • 信息:?Pre-instantiating?singletons?in?org.springframework.beans.factory.support.DefaultListableBeanFactory@19627bc:?defining?beans?[customerValidatorFactory,dateValidatorRule,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,customerValidatorConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor];?root?of?factory?hierarchy??
  • {dateValidatorRule=com.cathy.core.service.annotation.rule.DateValidatorRule@1758f2a}??
  • [Field?error?in?object?'target'?on?field?'current':?rejected?value?[2015?11?11];?codes?[must?date.target.current,must?date.current,must?date.java.lang.String,must?date];?arguments?[];?default?message?[must?be?date?pattern]]??
  • ?PS: spring的配置文件
    Java代碼??
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ????xmlns:p="http://www.springframework.org/schema/p"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ????xmlns:context="http://www.springframework.org/schema/context"?xmlns:tx="http://www.springframework.org/schema/tx"??
  • ????xmlns:aop="http://www.springframework.org/schema/aop"?xmlns:jee="http://www.springframework.org/schema/jee"??
  • ????xmlns:task="http://www.springframework.org/schema/task"??
  • ????xsi:schemaLocation="??
  • ????????http://www.springframework.org/schema/beans??
  • ????????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
  • ????????http://www.springframework.org/schema/context??
  • ????????http://www.springframework.org/schema/context/spring-context-3.0.xsd??
  • ????????http://www.springframework.org/schema/aop???
  • ????????http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
  • ????????http://www.springframework.org/schema/tx??
  • ????????http://www.springframework.org/schema/tx/spring-tx-3.0.xsd??
  • ????????http://www.springframework.org/schema/jee???
  • ????????http://www.springframework.org/schema/jee/spring-jee-3.0.xsd??
  • ????????http://www.springframework.org/schema/task????
  • ????????http://www.springframework.org/schema/task/spring-task-3.1.xsd????
  • ????????">??
  • ????<context:component-scan?base-package="com.cathy.core.service"/>??
  • ???
  • ???
  • ????<bean?id="customerValidatorConfig"?class="com.cathy.core.service.annotation.handle.CustomerValidatorConfig"/>??
  • ??????
  • ??????
  • ?????
  • </beans>??
  • 總結(jié)

    以上是生活随笔為你收集整理的自定义的注解校验器的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。