spring-boot - 如果对象列表中的字段值重复,是否有 java 验证的注释?

标签 spring-boot javax.validation

我有一个对象列表,每个对象都有一封电子邮件,我想验证电子邮件是否在此列表中重复。

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
Father create(@PathVariable String id,
        @Valid @RequestBody Father father) {
   ...
}

父亲会有一个 child 的列表:

private List<Child> childs;

每个 child 都会有一封电子邮件:

public class Child {
  ...

  @NotEmpty
  private String email;

  ...
}

我想验证是否有一个请求正文,其中有 2 个 child 使用相同的电子邮件。

是否可以或仅在接收并处理有效载荷后进行验证?

最佳答案

已编辑

要验证子电子邮件列表,您可以创建自定义验证。

我编写了一个自定义验证代码如下

1- Create annotation named ChildEmailValidation

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

    String message() default "Duplicate Email";

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

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

}

2- Create a validator for ChildEmailValidation

在这部分,您可以编写自定义业务进行验证。 (你可以写你的算法)

    public class ChildEmailValidator implements ConstraintValidator<ChildEmailValidation, List<Child>> {

    @Override
    public void initialize(ChildEmailValidation constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<Child> childList, ConstraintValidatorContext constraintValidatorContext) {

        //Create empty mailList
        List<String> mailList = new ArrayList<>();

        //Iterate on childList
        childList.forEach(child -> {

            //Checks if the mailList has the child's email
            if (mailList.contains(child.getMail())) {

                  //Found Duplicate email
                  throw new DuplicateEmailException();

            }

            //Add the child's email to mailList (If duplicate email is not found)
            mailList.add(child.getMail());

        });


        //There is no duplicate email
        return true;
      }

    }

3- Add @ChildEmailValidation in Father class

public class Father {

    List<Child> child;

    @ChildEmailValidation
    public List<Child> getChild() {
        return child;
    }

    public void setChild(List<Child> child) {
        this.child = child;
    }
} 

4- Put @Valid on fatherDto in the controller

@RestController
@RequestMapping(value = "/test/", method = RequestMethod.POST)
public class TestController {

    @RequestMapping(value = "/test")
    public GenericResponse getFamily(@RequestBody @Valid Father fatherDto) {
        // ...
    }

}

关于spring-boot - 如果对象列表中的字段值重复,是否有 java 验证的注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59955950/

相关文章:

java - 注解@NotEmpty不检查String是否为null

java - Hibernate 映射已被删除,但表中的行未被删除

java - 404 Not found Spring boot war to Tomcat

spring - 如何从 Spring WebClient 获取响应 json

java - 如何从 ConstraintViolationException 获取查询参数名称

java - 如何在 java.validation 约束上国际化 Spring RestController?

java - Spring Boot SPA URL 重写

java - 如何使用 Spring Boot 和 Flowable 修改邮件任务数据

java - @Valid(javax.validation.Valid) 对于列表的类型是不递归的

java - 如何对整数值使用 @Digits 验证