【问题标题】:javax.validation.UnexpectedTypeException: No validator could be found for type:javax.validation.UnexpectedTypeException:找不到类型的验证器:
【发布时间】:2015-01-02 13:30:23
【问题描述】:

以下是我们在尝试对整数类型的大小和模式进行验证时遇到的错误。 您能建议吗,我们需要在验证器 bean.xml 中为 Integer 类型设置大小和模式验证

05:58:57,342 ERROR [ErrorLoggerEJBInterceptor] Unexpected system error: No validator could be found for type: java.lang.Integer
javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.Integer
        at org.hibernate.validator.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:244)

【问题讨论】:

    标签: java hibernate validation integer


    【解决方案1】:

    感谢@Honey Goyal 下面是我的方式

    @Documented
    @Constraint(validatedBy = { AllowedIntegerValuesValidator.class})
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @ReportAsSingleViolation
    public @interface AllowedValues {
        String message() default "";
        Class<?>[] groups() default { };
        Class<? extends Payload>[] payload() default { };
        String[] value() default { };
    }
    
    public class AllowedIntegerValuesValidator implements ConstraintValidator<AllowedValues, Integer> {
        private List<Integer> valueList;
    
        @Override
        public void initialize(AllowedValues constraintAnnotation) {
            valueList = new ArrayList<>();
            for (String val : constraintAnnotation.value()) {
                valueList.add(Integer.parseInt(val));
            }
        }
    
        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext context) {
            if (!valueList.contains(value)) {
                return false;
            }
            return true;
        }
    }
    
        @AllowedValues(value={"7","9"}, message="only could be 7 or 9")
        private int location; 
    

    【讨论】:

      【解决方案2】:

      我只是在阅读此内容,但可能是 Integer 类型不能应用于 Pattern 约束吗?它将解释为什么会抛出 UnexpectedTypeException,因为只有当注释的类型与约束规范不匹配时才会抛出它。

      我发现 EE7 的 Pattern 约束如下:“带注释的 CharSequence 必须匹配指定的正则表达式。正则表达式遵循 Java 正则表达式约定,请参阅 Pattern。 接受字符序列。 null 元素被认为是有效的。”

      源代码:http://docs.oracle.com/javaee/7/api/javax/validation/constraints/Pattern.html


      在 EE6 中,它似乎仅限于字符串:“带注释的字符串必须...接受字符串。null 元素被认为是有效的。”

      src:http://docs.oracle.com/javaee/6/api/javax/validation/constraints/Pattern.html


      示例:

      @Pattern(regexp = "<insert regex here>")
      Integer evaluateMe;
      

      这应该会导致 UnexpectedTypeException,因为 Pattern 约束需要 CharSequence (EE7) 或 String (EE6),但找到了 Integer 类型。



      输入此内容后,我阅读了 Sridhar DD 的参考资料,这证实了这一点:)

      【讨论】:

      • 是的,`@Pattern(regexp="^[79]$") 私有 int 位置; ` 运行 junit 测试时抛出 javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Pattern' validating type 'java.lang.Integer'. Check configuration for 'location'] with root cause
      【解决方案3】:

      您一定已经实现了这个类 ConstraintValidator 并覆盖了这个方法?

      @Override
      public boolean isValid(XYZclass xyz, ConstraintValidatorContext context) {
      

      将 XYZclass 更改为 Integer 并实现 ConstraintValidator&lt;XYZContraint, Integer&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-06
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 2011-08-24
        • 2013-06-09
        相关资源
        最近更新 更多