[ https://issues.apache.org/jira/browse/TAP5-2776?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17841159#comment-17841159 ]
Roman Trapickin commented on TAP5-2776: --------------------------------------- As promised, here are the code snippets from our Tapestry Spring Boot setup (simplified for better readability): {code:java|title=TapestrySpringBootFilter.java} @Override public void init(FilterConfig filterConfig) throws ServletException { ((ConfigurableApplicationContext) WebApplicationContextUtils .getRequiredWebApplicationContext(config.getServletContext())) .addBeanFactoryPostProcessor(this::delayedInit); } private void delayedInit(ConfigurableListableBeanFactory beanFactory) { // ... registry.performRegistryStartup(); appInitializer.announceStartup(); registry.cleanupThread(); } // the rest is almost identical to TapestryFilter {code} {code:java|title=TapestrySpringBootFilter.java} ObjectProvider springBeanProvider = new ObjectProvider() { @Override public <T> T provide(Class<T> t, AnnotationProvider p, ObjectLocator l) { Map<String, T> beanMap = WebApplicationContextUtils .getRequiredWebApplicationContext(servletContext) .getBeansOfType(t); switch (beanMap.size()) { case 0: return null; case 1: return t.cast(beanMap.values().iterator().next()); // ... } } }; {code} Please let me know if you need any further information. > 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 > > 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. 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)