我在命令行上以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语句?