Блок if и else выполняется во время весеннего метода, аннотированного как Transactional
Когда я перехожу по ссылке / translation-account, в консоли tomcat я вижу, что блоки if и else также выполняются. Я могу видеть:
печать из ColorConsoleHelper.getGreenLog("loginView") и из ColorConsoleHelper.getGreenLog ("подтверждение AccountView")
Это действительно странное поведение. Зачем?
@RequestMapping(value = "/confirmation-account", method = RequestMethod.GET)
@Transactional
public ModelAndView displayConfirmationAccountPage(ModelAndView modelAndView, @RequestParam Map<String, String> requestParams) {
final int ACTIVE_USER = 1;
// find the user associated with the confirmation token
UserEntity userEntity = userService.findUserByConfirmationToken(requestParams.get("token"));
// this should always be non-null but we check just in case
if (userEntity!=null) {
// set the confirmation token to null so it cannot be used again
userEntity.setConfirmationToken(null);
// set enabled user
userEntity.setEnabled(ACTIVE_USER);
// save data: (token to null and active user)
saveAll(userEntity.getTrainings());
/*
RedirectAttributes won't work with ModelAndView but returning a string from the redirecting handler method works.
*/
modelAndView.addObject("successMessage", "Konto zostało pomyślnie aktywowane!");
modelAndView.setViewName("loginView");
ColorConsoleHelper.getGreenLog("loginView");
} else {
ColorConsoleHelper.getGreenLog("confirmationAccountView");
modelAndView.addObject("errorMessage", "Link jest nieprawidłowy...");
modelAndView.setViewName("confirmationAccountView");
}
return modelAndView;
}
public void saveAll(List<TrainingUserEntity> trainingUserEntityList) {
for ( TrainingUserEntity trainingUserEntity : trainingUserEntityList) {
entityManagerService.mergeUsingPersistenceUnitB(trainingUserEntity);
}
}
public void mergeUsingPersistenceUnitB(Object object) {
EntityManager entityManager = getEntityManagerPersistenceUnitB();
EntityTransaction tx = null;
try {
tx = entityManager.getTransaction();
tx.begin();
entityManager.merge(object);
tx.commit();
}
catch (RuntimeException e) {
if ( tx != null && tx.isActive() ) tx.rollback();
throw e; // or display error message
}
finally {
entityManager.close();
}
}
1 ответ
Ниже решение и объяснение:
Поскольку ссылка на / account-account вызывается дважды, это вызвано тем, что динамический прокси-сервер и метод @Transactional аннотированы в контроллере. Обязательно проверьте, сколько вызывается метода displayConfirmationAccountPage. Это обходной путь.
Как вы думаете, хорошо это или нет аннотированному методу контроллера @Transactional?