Apache Tapestry @CommitAfter не работает после перенаправления на другую страницу

У меня есть следующий сценарий в MyPage.java:

import org.apache.tapestry5.Link;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;

public MyPage {
    @Property
    @Persist
    private SubmitAction submitAction; // an enumeration

    @OnEvent(value = EventConstants.SUCCESS, component = "mainForm")
    Object onSuccessFromMainForm() {
        Link link = null;

        commitSomething();

        if (submitAction != null && this.submitAction.equals(SubmitAction.APPROVE)) {
            link = linkService.getLink(AnotherPage.class, true, "anotherPage");
        } else {
            link = linkService.getLink(MyPage.class, actionId, documentId);
        }

        return link;
    }

    @CommitAfter
    private void commitSomething() {
        // here are some interaction with Dao and Service layers.
    }

    Object onActivate(Long actionId, Long documentId) {
        // url handler
        // do something
        return null;
    }
}

Идея в том, что если выполняются некоторые условия для ссылки на AnotherPage: http://localhost:7001/myproject/anotherpage

В противном случае, чтобы остаться на той же странице с параметрами URL: http://localhost:7001/myproject/mypage/678123/567234

Ожидаемое поведение заключается в том, что @CommitAfter должен работать в обоих случаях, но работает только тогда, когда ссылка ведет на одну и ту же страницу.

У вас есть идеи, почему это может произойти?


Обновлено:

На самом деле я нашел решение - это не только проблема с Apache Tapestry. Основная проблема была с моей бизнес-логикой, которая зависит от onActivate. В этом методе Apache tapestry не смог установить некоторые поля @Persist и сломал мою логику. Я добавил метод onPassivate, и теперь он работает нормально.

Прошу прощения, если я потерял ваше время и спасибо за все ответы!

он должен работать в любом случае, попробуйте поставить точку останова в org.apache.tapestry5.internal.jpa.CommitAfterMethodAdvice и отследить выполнение

Dmitry Gusev 23.01.2019 14:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
150
1

Ответы 1

Вы можете поместить @CommitAfter только в метод, который вызывается гобеленом. Tapestry не знает о вашем закрытом методе commitSomething(). Он не может перехватить вызов этого метода

Это неправда: Tapestry инструментирует все методы в классах страниц/компонентов независимо от их видимости (см. CommitAfterWorker); этого должно быть достаточно, чтобы вызвать этот метод из любого места.

Dmitry Gusev 24.01.2019 17:29

Хм... магия манипулирования байт-кодом. я исправлюсь

lance-java 24.01.2019 18:05

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