考虑以下代码片段。(我使用的是 Spring 3.1 和 Hibernate 3.6)
@Override
@Transactional
public <T extends Termination> void progressToPendingStage(Class<T> entity,
Long terminationId, String userName) throws Exception {
Termination termination = findTerminationById(entity, terminationId);
//TODO improvise such that email does not get sent if data is not saved
if (termination.getStatus().equals(TerminationStatus.BEING_PREPARED.toString())) {
termination.setStatus(TerminationStatus.PENDING.toString());
termination.setSubmittedDate(new Date());
termination.setSubmittedBy(userName);
saveOrUpdateTermination(termination);
//Send an email to SAS
emailHelper.configureEmailAndSend(termination);
}
}
上述方法的单元测试表明,无论 saveOrUpdateTermination(termination) 是否引发异常,都会发送电子邮件。在进一步的测试和一些研究中,我发现这种行为是预期的行为。这不是业务规则所希望的。只有在成功保存终止记录时才应发送电子邮件。关于如何使其以所需方式运行的任何建议?我能想到的一种方法是让调用者处理 progressToPendingStage 方法抛出的异常,如果没有抛出异常,则发送电子邮件。我是在正确的轨道上还是我们可以改变@Transaction 的行为方式。