У меня есть следующий сценарий в 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, и теперь он работает нормально.
Прошу прощения, если я потерял ваше время и спасибо за все ответы!




Вы можете поместить @CommitAfter только в метод, который вызывается гобеленом. Tapestry не знает о вашем закрытом методе commitSomething(). Он не может перехватить вызов этого метода
Это неправда: Tapestry инструментирует все методы в классах страниц/компонентов независимо от их видимости (см. CommitAfterWorker); этого должно быть достаточно, чтобы вызвать этот метод из любого места.
Хм... магия манипулирования байт-кодом. я исправлюсь
он должен работать в любом случае, попробуйте поставить точку останова в
org.apache.tapestry5.internal.jpa.CommitAfterMethodAdviceи отследить выполнение