[
https://issues.apache.org/jira/browse/TAP5-2776?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17854116#comment-17854116
]
Roman Trapickin commented on TAP5-2776:
---------------------------------------
Hello Ben! Thank you very much for your suggestion. We could indeed implement
an {{@Advise}} method in our TapestryModule to defer the preloading and
overcome the issues mentioned above. Even though the {{@Advise}} method works
perfectly fine, I would still prefer a less hacky solution which would not
break on the next update.
I'm excited to hear what Thiago has to say about it. For reference reasons,
I'll post the workaround which worked for us. I hope it helps to outline the
API usage:
{code:java|title=Custom advise method in TapestryModule}
@Match("*Impl")
@Advise(serviceInterface = PageClassLoaderContextManager.class)
public static void advisePreload(MethodAdviceReceiver receiver) throws
NoSuchMethodException {
receiver.adviseMethod(PageClassLoaderContextManager.class.getMethod("preload"),
inv -> {
if (INVOKE_PRELOAD.get()) inv.proceed();
});
}
{code}
{code:java|title=Execute the preload() method later, e.g. on Spring
ContextRefreshedEvent}
class PagePreLoader implements ApplicationListener<ContextRefreshedEvent> {
@Autowired PageClassLoaderContextManager mgr;
@Override public void onApplicationEvent(ContextRefreshedEvent event) {
// ...
if (prodMode) {
INVOKE_PRELOAD.set(true);
mgr.preload();
}
}
}
{code}
> Make page preloading optional in production mode
> ------------------------------------------------
>
> Key: TAP5-2776
> URL: https://issues.apache.org/jira/browse/TAP5-2776
> Project: Tapestry 5
> Issue Type: Bug
> Components: tapestry-core
> Affects Versions: 5.8.5, 5.8.6
> Reporter: Roman Trapickin
> Priority: Major
> Attachments: tap5-2776.zip
>
>
> We use Tapestry 5.8.4 and Spring Boot 2.7 in production. To make things work,
> Tapestry context is initialized by the Spring context, not vice versa as done
> by {{tapestry-spring}}. This a tricky situation since Tapestry needs Spring
> beans and Spring beans sometimes need Tapestry beans.
> To solve this problem we exploit Spring's BeanFactoryPostProcessor in order
> to initialize Tapestry context before Spring beans are evaluated:
> # Start initializing Spring context
> # "Pause" within BeanFactoryPostProcessor and initialize Tapestry context.
> Tapestry beans do not need fully initialized Spring beans yet.
> # Finish Spring context initialization.
> # Tapestry beans and pages can now inject fully initialized Spring beans.
> I'll provide some code snippets in the comments below.
> TAP5-2772 has changed the preloading behavior in production mode so that
> Tapestry now eagerly resolves the Spring beans, thus relying on a fully
> initialized Spring context. Since Spring context init is not finished yet, a
> good amount of unresolved bean/property exceptions is thrown. Now we cannot
> break this vicious cycle of both contexts having a need for each other. This
> problem is not present in development mode.
> I file this issue as a bug since we need the old behavior to be restored in
> production mode. Alternatively we could introduce a setting for production
> mode to disable the new preloading feature.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)