如何验证pojo集合

时间:2019-08-27 13:15:53

标签: java spring spring-boot collections

我有一些pojo对象

public class Assignment {
    Date entrydate;
    Date exitdate;
    String team, 
    double allocation;
    String username,
    //getters and setters
}

示例值是 对象1:

  

输入日期:“ 2000-01-01”,   退出日期:“ 2019-03-31”,   团队:“ team1”,   分配:0.5   用户名:“ user1”

对象2:

  

输入日期:“ 2000-01-01”,   退出日期:“ 2019-03-31”,   团队:“ team2”,   分配:0.5   用户名:“ user1”

对象3:

  

输入日期:“ 2019-04-01”,   退出日期:“ 2019-07-31”,   团队:“ team3”,   分配:0.6   用户名:“ user1”

对象4:

  

输入日期:“ 2019-05-01”,   退出日期:“ 2019-07-31”,   团队:“ team4”,   分配:0.6   用户名:“ user1”

我的标准是针对特定用户,并且在特定日期段内,总分配数应为1 =>逻辑上的解释是工程师在特定时期内的工作量不应超过100%或少于100%。 / p>

我们需要一个函数,在该函数中我们传递上述pojo对象的集合,如果该集合不符合此条件,则应抛出一个错误并给出正确的解释-像在此日期范围内,指定团队的分配已超过1。另外,此方法还应检查日期间隔(如果有的话)-该功能的逻辑解释是-工程师在指定时期内不应处于空闲状态

方法签名将为

List<String> getValidation(List<Assignment > assignments);

(假设我们知道所有分配都属于特定用户->现在无需担心用户名)

如何正确执行此操作

1 个答案:

答案 0 :(得分:1)

有几种解决方法。 javax-validation-api中已经有现有的注释,例如NotNullMinMax,...

您只需在pojo变量上为这些情况使用这些注释,如下所示。

public class Assignment {
    Date entrydate;
    Date exitdate;
    String team, 
    @Min(0)
    @Max(1)
    double allocation;
    String username,
    //getters and setters
}

您需要通过以下@Valid批注指示您的控制器您需要对请求正文进行验证。

@PostMapping("someEndPoint")
public ResponseEntity getSomeThing(@Valid @RequestBody requestBody)
{
}

在必须验证@PathVariable的情况下,您必须像在控制器类本身上使用@Validated

@Api("AssignmentController")
@RestController
@Validated
@RequestMapping(value = "/api/admin")
public class AssignmentController {
}

如果需要在javax validations未提供的字段上进行自定义验证,则可以为此目的实现自定义验证器和自定义注释。

让我们看一个示例,您要创建一个注释@ValidAllocation来验证您的allocation字段。

创建自定义注释:

@Documented
@Retention(RUNTIME)
@Target({FIELD, ANNOTATION_TYPE, PARAMETER})
@Constraint(validatedBy = AllocationValidator.class)
public @interface ValidAssignment {
    String message() default "Assignment should be between 0 and 1";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

创建供注释使用的自定义验证器:

@Component
public class AllocationValidator implements ConstraintValidator<ValidAssignment, Double> {

    @Override
    public boolean isValid(Double value, ConstraintValidatorContext constraintValidatorContext) {
        return (value >=0 && value <=1);
    }

    @Override
    public void initialize(ValidAssignment validAssignment)  {}
}

您的Pojo外观如下所示

public class Assignment {
    Date entrydate;
    Date exitdate;
    String team, 
    @ValidAllocation
    double allocation;
    String username,
    //getters and setters
}

让我知道您是否有任何问题:)