Search code examples
javalocalizationstruts2migration

Migrate from Struts 2.3.33 to Struts 2.5.12 LocalizedTextUtil is removed


We tried to migrate from Struts 2.33 to Struts 2.5.12.

We used LocalizedTextUtil in our application directly.

I found that the LocalizedTextUtil is removed from com.opensymphony.xwork2.util.LocalizedTextUtil. I tried to search but could not find any thing

I found some classes like StrutsLocalizedTextProviderand GlobalLocalizedTextProvider but it seems they are not what I can use them.

I have reviewed migration-guide but could not find any comment about it.

Which alternative is there?


Solution

  • The struts.xml should be set as:

    <constant name="struts.xworkTextProvider" value="DefaultTextProvider" />
    <bean type="com.opensymphony.xwork2.TextProvider" name="DefaultTextProvider" class="utils.MyTextProviderFactory" scope="default" />
    

    And CustomStrutsTextProviderFactory could add bundles

    public class MyTextProviderFactory implements TextProviderFactory {
    
    protected LocaleProviderFactory localeProviderFactory;
    protected LocalizedTextProvider localizedTextProvider;
    
    @Inject
    public MyTextProviderFactory(LocaleProviderFactory localeProviderFactory, LocalizedTextProvider localizedTextProvider) {
        this.localeProviderFactory = localeProviderFactory;
        this.localizedTextProvider = localizedTextProvider;
        
        this.localizedTextProvider.addDefaultResourceBundle("messages/label");
        this.localizedTextProvider.addDefaultResourceBundle("messages/customerA/label");
        
    }
    
    @Override
    public TextProvider createInstance(Class clazz) {
        TextProvider instance = getTextProvider(clazz);
        if (instance instanceof ResourceBundleTextProvider) {
            ((ResourceBundleTextProvider) instance).setClazz(clazz);
            ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProviderFactory.createLocaleProvider());
        }
        return instance;
    }
    
    @Override
    public TextProvider createInstance(ResourceBundle bundle) {
        TextProvider instance = getTextProvider(bundle);
        if (instance instanceof ResourceBundleTextProvider) {
            ((ResourceBundleTextProvider) instance).setBundle(bundle);
            ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProviderFactory.createLocaleProvider());
        }
        return instance;
    }
    
    protected TextProvider getTextProvider(Class clazz) {
        return new TextProviderSupport(clazz, localeProviderFactory.createLocaleProvider(), localizedTextProvider);
    }
    
    protected TextProvider getTextProvider(ResourceBundle bundle) {
        return new TextProviderSupport(bundle, localeProviderFactory.createLocaleProvider(), localizedTextProvider);
    }
    

    }

    Complete credits to @LukazLenart https://issues.apache.org/jira/browse/WW-4829