javax.validation.UnexpectedTypeException:找不到类型的验证器:

时间:2014-11-06 06:05:19

标签: java hibernate validation integer

以下是我们在尝试对Integer类型的大小和模式进行验证时得到的错误。 你能建议吗,我们需要在验证器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)

3 个答案:

答案 0 :(得分:5)

我只是在阅读这篇文章,但可能是类型Integer无法应用于Pattern约束吗?它将解释为什么抛出UnexpectedTypeException,因为只有在annoted类型与约束规范不匹配时才抛出它。

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

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


在EE6中,它似乎仅限于String:"带注释的String必须...接受字符串。 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的参考资料,证实了这一点:)

答案 1 :(得分:1)

您必须已实现此类ConstraintValidator并重写此方法吗?

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

将XYZclass更改为Integer并实施ConstraintValidator<XYZContraint, Integer>

答案 2 :(得分:0)

谢谢@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;