首页 > 解决方案 > 自定义注释初始化方法不起作用

问题描述

这是我的注释类

package com.meet.springdemo.mvc.validation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Constraint(validatedBy = CourseCodeConstraintValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface CourseCode {

    // define default course code
    public String value() default "LUV";

    // define default error message
    public String message() default "must start with LUV";

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

    // define default payloads
    public Class<? extends Payload>[] payload() default {};
}

这是我的 constraintValidator 类,在这里我试图验证输入字符串,无论它是否以给定的前缀开头并返回布尔值truefalse

package com.meet.springdemo.mvc.validation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CourseCodeConstraintValidator 
    implements ConstraintValidator<CourseCode, String> {

    private String coursePrefix;

    @Override
    public void initialize(CourseCode theCourseCode) {
        coursePrefix = theCourseCode.value();
    }

    @Override
    public boolean isValid(String theCode, 
                        ConstraintValidatorContext theConstraintValidatorContext) {

        boolean result;

        System.out.println("Course prefix : "+ coursePrefix);
        System.out.println("Course code : "+ theCode);

        if (theCode != null) {
            result = theCode.startsWith(coursePrefix);
        }
        else {
            result = true;
        }

        return result;
    }
}

这里initialize()方法在初始化时没有被调用。并调用 toisValid()打印任何内容System.out.println("Course prefix : "+ coursePrefix);

可以说,输入字符串theCodeABCDEF;然后它显示输出为:isValid()

Course prefix : 
Course code : ABCDEF

标签: javaspringannotationscustomvalidator

解决方案


假设您有一个具有几个字段的模型,并且您正在尝试验证其中一个名为codeString 类型的字段,并使用@CourseCode. 假设模型被称为Course。所以像:

public class Course {

    @CourseCode
    private String code;

    // some other attributes here

    public String getCode() {
        return this.code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    // some other getters / setters here
}

Java 提供了一个javax.validation.Valid可用于约束验证的注解。来自javax.validation.Valid注释的 Java 文档:

标记验证级联的属性、方法参数或方法返回类型。在验证属性、方法参数或方法返回类型时,验证对象及其属性上定义的约束。此行为以递归方式应用。

因此,基本上您希望将此@Valid注释应用于您希望验证其定义的约束的对象。假设您Course在一个非常基本的控制器中使用该模型。您可以像这样注释 POSTedCourse对象:

@Controller
@RequestMapping
public class CourseController {

    @PostMapping
    public addNewCourse(@RequestBody @Valid Course newCourse) {
        // perform some persistence logic
    }
}

在我们进入方法之前,之前的@Valid注释Course newCouse将对象标记newCourse为待验证。addNewCourse

现在您的代码应该输入initialize()方法,CourseCodeConstraintValidator然后执行验证逻辑isValid()


推荐阅读