You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Lukasz Lenart (Jira)" <ji...@apache.org> on 2026/10/12 11:03:00 UTC

[jira] [Resolved] (WW-5766) Support struts.scopedConstantProvider in Java-based configuration (ConstantConfig)

     [ https://issues.apache.org/jira/browse/WW-5766?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Lukasz Lenart resolved WW-5766.
-------------------------------
    Resolution: Fixed

> Support struts.scopedConstantProvider in Java-based configuration (ConstantConfig)
> ----------------------------------------------------------------------------------
>
>                 Key: WW-5766
>                 URL: https://issues.apache.org/jira/browse/WW-5766
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Core
>            Reporter: Lukasz Lenart
>            Priority: Major
>             Fix For: 7.5.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> h2. Background
> [WW-3476|https://issues.apache.org/jira/browse/WW-3476] adds package-scoped constants. Part of that is a new bean-selection extension point, {{ScopedConstantProvider}}, selected through the {{struts.scopedConstantProvider}} constant ({{StrutsConstants.STRUTS_SCOPED_CONSTANT_PROVIDER}}). It is covered for XML and properties configuration, but not for Java-based configuration ({{StrutsJavaConfiguration}}).
> h2. Problem
> Java-based configuration passes constants only through the typed {{ConstantConfig}} class: {{StrutsJavaConfigurationProvider}} reads them from {{ConstantConfig.getAllAsStringsMap()}}, and there is no way to set an arbitrary key. {{ConstantConfig}} has no field for {{struts.scopedConstantProvider}}, so an application using Java-based configuration cannot select a custom {{ScopedConstantProvider}}. The only workaround is to subclass {{ConstantConfig}} and override {{getAllAsStringsMap()}}.
> h2. What to add
> In {{core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java}}, following the existing {{localizedTextProvider}} mapping:
> * a {{BeanConfig}} field {{scopedConstantProvider}}, next to {{localizedTextProvider}}
> * an entry in {{getAllAsStringsMap()}}:
> {code:java}map.put(StrutsConstants.STRUTS_SCOPED_CONSTANT_PROVIDER, beanConfToString(scopedConstantProvider));
> {code}
> * a getter and two setters, modelled on {{setLocalizedTextProvider}}:
> {code:java}public BeanConfig getScopedConstantProvider()
> public void setScopedConstantProvider(BeanConfig scopedConstantProvider)
> public void setScopedConstantProvider(Class<? extends ScopedConstantProvider> clazz)
> {code}
> h2. Tests
> * {{ConstantConfigTest.testGetAllAsStringsMap}}: the new key maps to the bean name.
> * {{StrutsJavaConfigurationProviderTest}}: a Java configuration that registers a custom {{ScopedConstantProvider}} bean through {{beans()}} and selects it through {{ConstantConfig}} resolves to that bean.
> * {{StrutsJavaConfigurationProviderTest}}: a {{ScopableConstants}} bean registered through {{beans()}} satisfies the startup validation of {{<scoped-constant>}} (this already works and is not yet covered by a test).
> h2. Already working, no change needed
> * Registering {{ScopableConstants}} beans and a custom provider bean through {{StrutsJavaConfiguration.beans()}}.
> * {{PackageConfig}}, the startup validation in {{DefaultConfiguration}} and {{StrutsScopedConstantProvider}} work the same whatever configuration a value came from.
> h2. Out of scope
> * Package-level overrides in Java-based configuration: {{StrutsJavaConfiguration}} has no package concept ({{StrutsJavaConfigurationProvider.loadPackages()}} is empty), so there is nothing to attach them to.
> * Other bean-selection constants that {{ConstantConfig}} does not map either (for example {{struts.parameterAuthorizer}}, {{struts.parameterAllowlister}}, {{struts.ognlGuard}}, {{struts.proxyService}}). That is a separate gap.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)