【问题标题】:Custom annotation not called未调用自定义注释
【发布时间】:2016-06-08 02:34:50
【问题描述】:

我为验证我的 bean 字段做了自定义注释。我使用@Age(value = 10) 注释来验证年龄。我写了如下代码。

import java.lang.annotation.Documented;  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
import javax.validation.Constraint;  
import javax.validation.Payload;  



@Documented
@Constraint(validatedBy = AgeConstraintValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Age {

    String message() default "{Age is not valid }";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int value();
}

这是年龄约束验证器的代码

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class AgeConstraintValidator   implements ConstraintValidator< Age, Long> {

    private Age age;

    @Override
    public void initialize(Age age) {
        this.age = age;
    }

    @Override
    public boolean isValid(Long dob, ConstraintValidatorContext context) {
        System.out.print(" age in annotion");
              if(dob != age.value()){
                     return true;
                 }
        return false;
    }

}

现在当我在我的 bean 中使用 @Age(value = 10) 时,它不被称为 Age 注释。谁能告诉我代码中的任何错误。当我创建我的 bean 对象并为测试分配年龄不同但我无法对 bean 的字段进行任何验证。

【问题讨论】:

  • 你需要在你的配置中指出这个注解。你使用什么框架?春天?如果您有弹簧自动查找,请尝试使用 @Component 注释 Anntation。还显示您在何处以及如何使用此注释。也许你需要使用 CGLIB
  • @KrzysztofCichocki 我正在使用弹簧
  • 显示你正在使用这个注解的类
  • 类用户 { @Age( value =10) int age ; //getter 和 setter }
  • 好的,所以您需要使用 cglib 来代理对字段的访问。你应该使用 AOP 框架。看看这篇文章的提示:stackoverflow.com/questions/1706751/…

标签: java spring hibernate rest validation


【解决方案1】:

Spring 不会自动采用此自定义注释。您必须通过定义 BeanPostProcessor 来让 Spring 知道。创建一个实现它的类 例如

import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;

public class InitHelloWorld implements BeanPostProcessor {

   public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      System.out.println("BeforeInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }

   public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      System.out.println("AfterInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }

}

并在您的 spring 配置 xml 中提及此 bean,如下所示

 <bean class="<your pack>.InitHelloWorld" />

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多