2014-11-06 36 views
2

以下是我们在尝试对Integer类型的大小和模式进行验证时得到的错误。 你可以建议,我们需要设置整型大小和模式验证在验证bean.xmljavax.validation.UnexpectedTypeException:找不到可用于类型的验证程序:

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) 

回答

1

您必须实施这个类ConstraintValidator和重写此方法?

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

变化XYZclass于整数和实施ConstraintValidator<XYZContraint, Integer>

3

我只是读了这一点,但会不会是整数类型不能被应用到模式的约束?这将解释为什么会引发UnexpectedTypeException,因为只有当注释类型与约束规范不匹配时才会引发它。

对于EE7的模式约束,我发现以下内容:“注释的CharSequence必须与指定的正则表达式匹配,正则表达式遵循Java正则表达式约定,请参阅模式 接受CharSequence,null元素被认为是有效的。

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


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

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


例如:

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

这应该导致UnexpectedTypeException作为图案约束期望一个的CharSequence(EE7)或字符串(EE6),但发现键入整数。



打字后,我看了斯里达尔DD的参考,这证实了这一点:)

+0

是啊,'\t @Pattern(正则表达式= “^ [79] $”) \t private int location; '当运行junit测试时抛出'javax.validation.UnexpectedTypeException:HV000030:对于约束'javax.validation.constraints.Pattern'验证类型'java.lang.Integer',找不到验证器。根据原因检查“位置”的配置 – zhuguowei 2016-01-10 06:41:31

0

感谢@Honey戈亚尔 下面是我的方式

@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; 
相关问题