Lukasz Lenart created WW-5690:
---------------------------------
Summary: Remove core's FreeMarker dependency from
DefaultDispatcherErrorHandler
Key: WW-5690
URL: https://issues.apache.org/jira/browse/WW-5690
Project: Struts 2
Issue Type: Task
Components: Core
Reporter: Lukasz Lenart
Fix For: 7.4.0
Part of the WW-5689 lean-core work, but self-contained and shippable in 7.x.
*Scope note.* This is about _core's own_ dependency on FreeMarker. Applications
using the Struts tag library still require FreeMarker regardless:
{{struts.ui.templateSuffix}} defaults to {{ftl}} and all 129 bundled theme
templates are {{.ftl}}. What these tickets buy is that a REST/JSON-only
application — one that never renders a tag — stops paying for FreeMarker.
h2. Current behaviour
{{DefaultDispatcherErrorHandler}} renders the dev-mode error report through
FreeMarker:
* it holds an injected {{FreemarkerManager}}
* {{init(ServletContext)}} calls {{freemarkerManager.getConfiguration(ctx)}}
and loads {{/org/apache/struts2/dispatcher/error.ftl}}
* only {{handleErrorInDevMode(...)}} ever uses the resulting template
{{init()}} is *unconditional*. It runs at dispatcher startup and initialises
the whole FreeMarker configuration even in production mode, where the template
is never rendered — {{handleError(...)}} goes to {{sendErrorResponse(...)}} and
delegates to the container's error page.
h2. Proposal
Render the dev-mode error report without FreeMarker — a plain Java renderer is
sufficient for what {{error.ftl}} produces.
Failing that, the minimum acceptable change is to make the template load lazy
and gate it on devMode, so a production deployment never touches FreeMarker
through this path.
{{DispatcherErrorHandler}} is already a pluggable bean, so a FreeMarker-based
handler can remain available for anyone who has customised {{error.ftl}}.
h2. Compatibility
{{error.ftl}} is an internal template, not a documented extension point. If the
plain renderer lands, note the change in the migration guide for anyone who has
overridden it.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)