当前位置: 首页 > 知识库问答 >
问题:

跨字段自定义约束注释不起作用

卜勇
2023-03-14

我有一个名为ContactTypeName的下拉字段,其中包含电话、电子邮件等值,还有一个名为Contact的输入字段。如果选择了下拉值email,我想验证输入字段的有效电子邮件地址。。。

@FieldMatch.List({    
    @FieldMatch(first = "contactDetail", second = "contectTypeName", message = "Please Enter a valid email address")
})
public class Contact {
    private int contactId = 0;
    @NotNull(message="Please Select a Contact Type")
    private Integer contectTypeId;
    private String contectTypeName;
    @NotNull(message="Please Specify Contact Details")
    private String contactDetail;   
}

我试图创建一个自定义约束,将验证contactDetail字段对电子邮件正则表达式,如果contactTypeName字段将具有值电子邮件

我有以下自定义约束的代码

@Target({TYPE, ANNOTATION_TYPE,METHOD, FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch
{
    String message() default "{constraints.fieldmatch}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    /**
     * @return The first field
     */
    String first();

    /**
     * @return The second field
     */
    String second();

    /**
     * Defines several <code>@FieldMatch</code> annotations on the same element
     *
     * @see FieldMatch
     */
    @Target({TYPE, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
            @interface List
    {
        FieldMatch[] value();
    }
}

验证器就像

public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object>
{
    private String firstFieldName;
    private String secondFieldName;

    private Pattern pattern;
    private Matcher matcher;


    private static final String EMAIL_PATTERN = 
            "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";



    @Override
    public void initialize(final FieldMatch constraintAnnotation)
    {
        firstFieldName = constraintAnnotation.first();
        secondFieldName = constraintAnnotation.second();
        pattern = Pattern.compile(EMAIL_PATTERN);

    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context)
    {
        try
        {           
            final Object firstObj = BeanUtils.getProperty(value, firstFieldName);//email address
            final Object secondObj = BeanUtils.getProperty(value, secondFieldName);//value of the contactType

            System.out.println((String) firstObj);
            System.out.println((String) secondObj);

            if(((String) firstObj == "" || (String) firstObj == null ) && (String) secondObj != "Email"){
                return true;
            }else{
                matcher = pattern.matcher((String) firstObj);
                return matcher.matches();

            }

            //return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
        }
        catch (final Exception ignore)
        {
            // ignore
        }
        return true;
    }
}

问题是它没有在表单上触发...我使用Prime Faces模型对话框,其中要验证的bean被呈现

参考:使用Hibernate验证器进行跨域验证(JSR 303)

期待您的建议和指导

共有1个答案

丌官盛
2023-03-14

JSF 2.0还不支持跨字段验证https://hibernate.onjira.com/browse/BVAL-214

要使其工作,要么使用像Seamface这样的库,要么手动调用验证,如

    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<Contact>> violations = validator.validate(contact);
 类似资料:
  • 我试图创建自定义注释来检查唯一的字段值。例如,检查唯一的电子邮件地址等。 但无法自动关联“customerDAO”对象。它抛出异常组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套的异常是javax。验证。ValidationException:isValid调用期间发生意外异常。 我在哪里犯错?请建议。 顾客JAVA 唯一的JA

  • 问题内容: 我需要创建一个自定义约束注释,该注释可以访问我的bean的另一个字段的值。我将使用此批注来验证字段,因为它取决于另一个字段的值,但是我定义该字段的方式是编译器在我的字段“必须为常量表达式”中说“批注属性的值”。 我以这种方式定义了它: 在我的豆子中,我想要这样的东西: 有什么方法可以定义注释,以便字段值可以是变量? 谢谢 问题答案: 最简单的方法是退后一步:您编写的约束/验证器在字段级

  • 我正在尝试创建一个带有自定义注释和spring AOP的Spring Boot库。当我将这个库与新的spring boot应用程序一起使用时。那么它就不起作用了。就连我也没有任何错误。 库示例- 自定义注释 SpringAOP课程 波姆。xml 使用mvn clean install创建库 现在,新的库被导入到springboot应用程序中。 控制器中使用了新的自定义注释 控制器 请帮忙。

  • 当我尝试使用生成的post URL和以下json负载来使用save时: 请求处理失败;嵌套异常是javax.persistence.persistenceException:org.hibernate.id.IdentifierGenerationException:在调用save():eHealth.domain.timestamp之前必须手动分配该类的ID 我认为这是由于缺少@Generate

  • 我在项目中使用bean验证,我想为现有的约束注释编写一个自定义验证器。 例如,我有一个类,它表示一个名为CustomDateTime的日期/时间。在使用此类作为例如出生日期的类中,我想用过去的日期对字段进行注释: 然后,我通过实现ConstraintValidator创建一个自定义验证器 我知道您通常会创建这样的单独注释: 但对我来说,这似乎是双重代码;-) 如何注册要与一起使用的自定义验证器?