@Transactional //Spring transactional
void saveFile(ExcelFile file) {
//Each sheet have different kind of entities and it is an ordered insert and first insert is needed before the second set of inserts
for(each sheet in excel file) {
List<Entity> entityList = convertIntoEntities(sheet);
ValidationResult vr = validateEntities(entityList);
saveEntities(entityList);
}
ValidationResult validateEntities(List<Entity> entityList) {
validator.validate(entityList) // The new validation we need to do before
}
void saveEntities(List<Entity> entityList) {
dao.saveEntities(entityList);
}
여기서 엔티티 목록은 Excel 파일을 읽은 후에 형성되며 유효성 검사 논리 인 Excel 파일을 추가합니다. 검증 만하기 전에 기존 데이터베이스 항목을 읽어야합니다.예외 클래스에 멤버 변수가있는 경우
이제 유효성 검사기는 데이터베이스에서 기존 엔티티 (다른 테이블의 일부 항목)를 볼 필요가있는 Excel의 유효성을 검사합니다 (외부 제약이 아니며 일부 비즈니스 논리가 있음). 유효하지 않은 각 유효성 검사에 대한 validationErrorMessages 목록이 생성됩니다 실재.
유효성 검사 클래스의 구조는
ValidationResult {
boolean isValid;
List<String> errorMessage;
}
두 솔루션은 내 마음에
변화의 서명을했다입니다 저장에 ValidationResult를 전송 (또는 다른 클래스로 포장). 이 경우 우리는 예외를 던지지 않을 때 @Transactional이 작업을 롤백하지 않도록 롤백을 관리해야합니다.
validationResult가있는 InvalidInputFileException을 던집니다. (ValidationResult를 저장하려는 이유는 사용자에게 유효성 검사 실패에 대해 알릴 필요가 있기 때문입니다.) 가 일치하지 않는 데이터에 대한 예외를 던져 정확하고 둘째 @Transactional이 잘 작동합니다 우리가 트랜잭션을 관리 할 필요가 없습니다으로
나는이 방법에 찬성입니다. 그러나 이전에 코드에서 Exception 클래스의 멤버 변수를 보지 못했지만 그렇게하는 것이 좋습니다.
지금 내가 생각 한 가지 방법은
class InvalidInputFileException extends RuntimeException {
ValidationResult vr;
}
귀하의 질문은 무엇입니까? –