Spring Boot 字段的值应为空或有效的ISBN

xtfmy6hx  于 2023-04-11  发布在  Spring
关注(0)|答案(1)|浏览(134)

表单

@Getter
@Setter
public class SourceForm {

    @ISBN(type = ISBN.Type.ANY)    
    private String isbn;
}

实体

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "sources")
public class SourceEntity  extends BaseEntity{
    @ISBN(type = ISBN.Type.ANY)
    @Column(columnDefinition = "varchar(255) default ''",
            nullable = false)
    private String isbn;   

}

问题

Isbn字段可以为空。换句话说:空或有效ISBN。
但是如果我在表单中将此字段留空,我会得到错误消息“无效的ISBN”。
接下来我可以尝试什么?

dvtswwa3

dvtswwa31#

@ISBN annotation的默认行为是不将空值视为有效的ISBN。但是,您可以实现一个自定义验证器来允许空值或验证ISBN。以下是如何为这种情况创建自定义验证器的示例:

@Constraint(validatedBy = { EmptyOrValidISBNValidator.class })
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EmptyOrValidISBN {

    String message() default "Invalid ISBN";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

以及自定义验证器的实现:

public class EmptyOrValidISBNValidator implements ConstraintValidator {
 @Override
public void initialize(EmptyOrValidISBN constraintAnnotation) {
    // Initialization logic, if any
}

@Override
public boolean isValid(String isbn, ConstraintValidatorContext context) {
    // Implement your own validation logic here
    // You can use the provided isbn parameter to validate if the ISBN is not empty or null, and if it is valid
    // Return true if the isbn is empty or valid, otherwise return false
    // For example, you can use regular expressions or external libraries to perform the ISBN validation

    // Validate if the ISBN is not empty or null and if it already exists
    if (Strings.isNotEmpty(isbn)) {
        return isValidIsbn10(isbn) || isValidIsbn13(isbn);
    }
    return true;
}

private boolean isValidIsbn10(String isbn) {
    String regex = "^(?:\\d{9}[\\d|Xx])|(?:\\d{1,5}-\\d{1,7}-\\d{1,6}-[\\d|Xx])$";
    return Pattern.matches(regex, isbn);
}

private boolean isValidIsbn13(String isbn) {
    String regex = "^(?:\\d{12}\\d|[\\d|-]{1,5}-\\d{1,7}-\\d{1,6}-\\d)$";
    return Pattern.matches(regex, isbn);
}

}

然后,您可以在代码中的字段上使用@EmptyOrValidISBN注解,自定义验证器EmptyISBNValidator将根据定义的逻辑允许空值或有效的ISBN。

相关问题