以下是我们在尝试对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)
答案 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;