Блок 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?

Другие вопросы по тегам