전자 메일 예외가 발생하면 트랜잭션을 롤백하지 않기를 원합니다. 내가 거래를 중첩 때문에Spring Transaction - noRollbackFor는 예외가 발생할 때 커밋하지 않습니다.
나는 HibernateTransactionManager
및
set property name="nestedTransactionAllowed" value="true"
을 사용하고 있습니다. 내가 this.getService()
를 호출하기 때문에
또한 내가
lookup-method name="getService" bean="enrollmentProcessorService"
이렇게하면 스프링 프록시를 설치해야합니다.
그러나 예외가 발생하면 트랜잭션은 계속 롤백됩니다. 내 코드는 다음과 같습니다
당신은 예외를 얻을 때마다@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void processConfirmation() throws SystemException {
//do something
this.getService().processConfirmationData(as400ContractId);
}
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {MailException.class})
public void processConfirmationData(final long as400ContractDataId) throws SystemException {
final AS400ContractData as400ContractData = this.readAS400ContractData(as400ContractDataId, false);
this.populateEnrollmentOptionAnswers(as400ContractData.getContractData());
final PersonalData personalData = this.readPersonalData(as400ContractData.getContractData()
.getEpiphanyPersonalData().getPersonalData().getId(), true);
try {
personalData.setConfirmMailSent(true);
as400ContractData.getContractData().getEpiphanyPersonalData().getPersonalData().setConfirmMailSent(true);
this.personalDataDAO.flush();
this.emailService.sendConfirmationMailToLOI(as400ContractData); //commit if exception is thrown here
} catch (final DataAccessException dae) {
LOGGER.error(CANNOT_UPDATE_PERSONAL_DATA_OBJECT, dae);
throw new SystemException(StringUtils.EMPTY, CANNOT_UPDATE_PERSONAL_DATA_OBJECT, dae);
} catch (final MessagingException e) {
LOGGER.error(CANNOT_SEND_CONFIRMATION_EMAIL, e);
throw new SystemException(StringUtils.EMPTY, CANNOT_SEND_CONFIRMATION_EMAIL, e);
} catch (final MailException e) {
Throwable rootCause = e.getRootCause();
System.out.println("caught");
보정 위의 구성에서 : 당신이 얻을 때마다 ** 런타임 ** 예외, 현재 트랜잭션이 롤백됩니다. –
네, 맞습니다. EJB는 UserTransaction 어노테이션을 제공합니다. 아마도 봄에 비슷한 것이있을 것입니다. – Anton