从application.properties中读取的Springboot自定义批注验证器

时间:2018-09-13 15:18:56

标签: java spring spring-boot

我在命令行上以csv解析器/验证器的身份运行springboot。我的要求是确保每个csv记录行中的批号与csv文件名中包含的批号匹配。如果不匹配,请记录错误并使作业失败。

示例

batch-12345-csv

传递CSV记录

row 1|row 2|12345

CSV记录失败

row 1|row 2|67890

我的想法是在启动时从文件名中解析批号,然后在配置对象中设置和设置批号。

我的下一个想法是在我的DTO类“ ValidateBatchNo”上创建一个自定义字段批注,并将配置对象动态传递到我的ConstraintValidator中,然后在其中找到已解析的批号并将其与csv记录进行比较。

我想知道是否有比当前解决方案更干净的方法来处理此问题。

课程

ApplicationConfig.java

@Configured
public class ApplicationConfig {

    private String homecareBatchNo;
    private String summaryBatchNo;

    getters/setters
}

SummaryDTO.java

@NotNull
@ValidateBatchNo(clazz = SummaryDTO.class)
private String batchNo;

HomeCareDTO.java

@NotNull
@ValidateBatchNo(clazz = HomeCareDTO.class)
private String batchNo;

ValidateBatchNo.java批注

@Documented
@Constraint(validatedBy = BatchNoValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@ReportAsSingleViolation
public @interface ValidateBatchNo {

    Class<?> clazz();

    String message() default "{validator.ValidateString.message}";

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

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

}

约束BatchNoValidator.java

public class BatchNoValidator implements ConstraintValidator<ValidateBatchNo, String> {

    @Autowired
    private ApplicationConfig config;

    private Class<?> clazz;

    @Override
    public void initialize(ValidateBatchNo constraintAnnotation) {
        this.clazz = constraintAnnotation.clazz();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        String batchNo;

        if(SummaryDTO.class.isAssignableFrom(clazz)) {
            batchNo = config.summaryBatchNo();
        } else if(HomecareDetailDTO.class.isAssignableFrom(clazz)) {
            batchNo = config.homecareBatchNo();
        } else {
            throw new IllegalArgumentException("Invalid batch validator class");
        }

        if(!batchNo.contains(value)) {
            return false;
        }
        return true;
    }

}

是否可以自动检测批注中的DTO类,并且具有更强大的方法来动态调用我的ApplicationConfig方法而无需if / else语句?

0 个答案:

没有答案