2015-01-19 8 views
0
@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; 
} 

두 솔루션은 내 마음에

  1. 변화의 서명을했다입니다 저장에 ValidationResult를 전송 (또는 다른 클래스로 포장). 이 경우 우리는 예외를 던지지 않을 때 @Transactional이 작업을 롤백하지 않도록 롤백을 관리해야합니다.

  2. validationResult가있는 InvalidInputFileException을 던집니다. (ValidationResult를 저장하려는 이유는 사용자에게 유효성 검사 실패에 대해 알릴 필요가 있기 때문입니다.) 가 일치하지 않는 데이터에 대한 예외를 던져 정확하고 둘째 @Transactional이 잘 작동합니다 우리가 트랜잭션을 관리 할 필요가 없습니다으로

나는이 방법에 찬성입니다. 그러나 이전에 코드에서 Exception 클래스의 멤버 변수를 보지 못했지만 그렇게하는 것이 좋습니다.

지금 내가 생각 한 가지 방법은

class InvalidInputFileException extends RuntimeException { 
ValidationResult vr; 

} 
+0

귀하의 질문은 무엇입니까? –

답변

3

네, 괜찮아요 발생 ValidationFailure의 경우였다. 예외는 클래스이며 다른 클래스와 마찬가지로 멤버 변수 및 메서드를 가질 수 있습니다. 그런데 예외의 가장 가까운 예는 정확하게 표준 위반 확인 프레임 워크에 의해 던져진 표준 ConstraintValidationException이며 제약 조건 위반을 포함합니다.

예외는 변경할 수 없지만, 상태는 생성시 설정되며 이후에는 변경되지 않습니다.