簡體   English   中英

javax.validation.UnexpectedTypeException:找不到類型的驗證器:

[英]javax.validation.UnexpectedTypeException: No validator could be found for type:

以下是我們在嘗試對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)

我只是在閱讀這篇文章,但可能是類型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:“帶注釋的字符串必須...接受字符串。空元素被認為是有效的。”

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的參考文獻,證實了它:)

您必須已實現此類ConstraintValidator並重寫此方法?

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

將XYZclass更改為Integer並實現ConstraintValidator<XYZContraint, Integer>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM