Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8524271
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 11, 20262026-06-11T07:38:30+00:00 2026-06-11T07:38:30+00:00

This is a subject that has been asked in many forums but I can’t

  • 0

This is a subject that has been asked in many forums but I can’t find any precise and concrete answer for it. Even the accepted answers are incomplete in my point of view, so I will try to post my complete attempt to solve this problem in hope to build a precise question + answer on the subject.

I’m trying to get Resource Bundles working in JSF. The Resource Bundles come from a Spring bean, which should be loaded from an arbitrary external system (ie a Database).

I will bypass the Database querying for now and use a mocked up Resource Bundle to keep things clear.

This is my Resource Bundle business implementation, which I managed to gather from other post on this forum:

public class TesteResBundle extends ReloadableResourceBundleMessageSource {

    private final Map<String, Map<String, String>> properties = new HashMap<String, Map<String, String>>();

    public TesteResBundle() {
        reload();
    }

    @Override
    protected MessageFormat resolveCode(String code, Locale locale) {
        String msg = getText(code, locale);
        MessageFormat result = createMessageFormat(msg, locale);
        return result;
    }

    @Override
    protected String resolveCodeWithoutArguments(String code, Locale locale) {
        return getText(code, locale);
    }

    private String getText(String code, Locale locale) {
        Map<String, String> localized = properties.get(code);
        String textForCurrentLanguage = null;
        if (localized != null) {
            textForCurrentLanguage = localized.get(locale.getLanguage());
            if (textForCurrentLanguage == null) {
                textForCurrentLanguage = localized.get(Locale.ENGLISH.getLanguage());
            }
        }
        return textForCurrentLanguage != null ? textForCurrentLanguage : code;
    }

    public void reload() {
        properties.clear();
        properties.putAll(loadTexts());
    }

    protected Map<String, Map<String, String>> loadTexts() {

        Map<String, Map<String, String>> m = new HashMap<String, Map<String, String>>();
        Map<String, String> v = new HashMap<String, String>();
        v.put("en", "good");
        v.put("pt", "bom");
        v.put("en_US", "bom");
        m.put("prop", v);

        v = new HashMap<String, String>();
        v.put("en", "bad");
        v.put("pt", "mau");
        v.put("en_US", "bom");
        m.put("pror", v);
        return m;
    }
}

This is a custom EL resolver that I also grabbed around in a forum. It tries to gather the message if the base is an instance of MessageSource. If not it passes the resolution to the default Spring EL resolver:

public class MessageSourcePropertyResolver extends SpringBeanFacesELResolver {

    public Object getValue(ELContext elContext, Object base, Object property)
        throws ELException {

        if (base instanceof MessageSource && property instanceof String) {
            String result = ((MessageSource) base).getMessage(
                (String) property, null, getLocale());

            if (null != result) {
                elContext.setPropertyResolved(true);
            }

            return result;
        }

        return super.getValue(elContext, base, property);
    }

     private Locale getLocale() {
        FacesContext context = FacesContext.getCurrentInstance();
        return context.getExternalContext().getRequestLocale();
     }

}

The custom EL resolver is defined in faces-config.xml:

<el-resolver>pt.teste.pojo.MessageSourcePropertyResolver</el-resolver>

Finally in Spring configuration I have the messageSource bean defined as:

<bean id="messageSource" class="pt.teste.pojo.TesteResBundle">
</bean>

I can confirm that the messageSource bean is instantiated correctly and the HashMap is correctly loaded upon the application startup. I can confirm that the custom handler is being called and is passing to the default Spring resolver all the EL’s that are not Resource Messages and is resolving correctly.

When I use a Resource Bundle in a xhtml JSF 2.0 page I’m doing it this way:

<h:outputText value="#{messageSource.prop}" />

During EL resolving, the custom resolver correctly detects the base as a MessageSource instance but fails at:

String result = ((MessageSource) base).getMessage((String) property, null, getLocale());

With the following exception:

org.springframework.context.NoSuchMessageException: No message found under code 'prop' for locale 'en_US'.
org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:65)
pt.teste.pojo.MessageSourcePropertyResolver.getValue(MessageSourcePropertyResolver.java:18)
com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIOutput.getValue(UIOutput.java:169)
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
com.sun.faces.renderkit.html_basic.CompositeRenderer.encodeChildren(CompositeRenderer.java:78)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
org.springframework.faces.webflow.FlowViewHandler.renderView(FlowViewHandler.java:99)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
org.springframework.faces.mvc.JsfView.renderMergedOutputModel(JsfView.java:85)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

I think that I may be missing something here, specifically in the messageSource bean definition in Spring config. I suspect of this because no method of TesteResBundle gets called when resolving the Resource Bundle.

Thank you for any help provided on this subject.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-11T07:38:31+00:00Added an answer on June 11, 2026 at 7:38 am

    I actually managed to craft a workaround for the problem. Since I’m doing my first baby-steps in Spring it would be nice if a Spring expert could review this approach as I don’t think it’s done in a “Spring way”. But if everything else is failing I will stick with this not-so-beautiful workaround.

    I usually have a singleton in my web applications that holds configuration artifacts. Right now it’s actually just holding a reference to the Spring application context:

    public class ApplicationConfig {
    
        private static ApplicationConfig instance = new ApplicationConfig();
    
        private ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    
        private ApplicationConfig(){
    
        }
    
        public static ApplicationConfig instance(){
            return instance;
        }
    
        public ApplicationContext getApplicationContext(){
            return context;
        }
    }
    

    I discarded the previous Resource Bundle implementation and instead extended AbstractMessageSource:

    public class TesteMessageSource extends AbstractMessageSource {
    
        @Override
        protected MessageFormat resolveCode(String key, Locale locale) {
            // This is just a dummy method.
            // It should lookup in a Map created in this same 
            // class for the correct key/locale resource value
            return createMessageFormat(key, Locale.US);
        }
    
        @Override
        protected String resolveCodeWithoutArguments(String key, Locale locale){
            // This is just a dummy method.
            // It should lookup in a Map created in this same 
            // class for the correct key/locale resource value
            return "dummyString";
        }
    }
    

    Then I noticed that the base parameter passed to the custom EL resolver is in fact an instance of DelegatingMessageSource. According to the Spring documentation: “Empty MessageSource that delegates all calls to the parent MessageSource”. So I modified the custom EL resolver to get the Spring application context from the singleton, then get the messageResource bean and set it as the parent MessageSource to the DelegatingMessageSource instance:

    public class MessageSourcePropertyResolver extends SpringBeanFacesELResolver /*implements MessageSourceAware */{
    
        public Object getValue(ELContext elContext, Object base, Object property)
            throws ELException {
    
            if (base instanceof MessageSource && property instanceof String) {
                DelegatingMessageSource delegatingMessageSource = (DelegatingMessageSource) base;
                BeanFactory factory = ApplicationConfig.instance().getApplicationContext();
                MessageSource messageSource = (MessageSource) factory.getBean("messageSource");
                delegatingMessageSource.setParentMessageSource(messageSource);
    
                String result = delegatingMessageSource.getMessage((String) property, new Object[] {}, getLocale());
                if (result != null) {
                    elContext.setPropertyResolved(true);
                }
    
                return result;
            }
    
            return super.getValue(elContext, base, property);
        }
    
        private Locale getLocale() {
            FacesContext context = FacesContext.getCurrentInstance();
            return context.getExternalContext().getRequestLocale();
        }
    }
    

    Spring messageSource bean configuration became:

    <bean id="messageSource" class="pt.teste.pojo.TesteMessageSource">
    </bean>
    

    Message resource access in Facelets xtml component became:

    <h:outputText value="${messageSource['prop.aaa']}" />
    

    Where prop.aaa is passed as the “property” parameter to the custom EL resolver and we just have to lookup for that “property” and the Locale that is also passed to the resolver.

    This way everything is working, but I’m almost certain that this can be done in a better and correct way, like passing an already configured MessageSource to the custom EL resolver. With this I mean passing an instance of the custom MessageSource, or at least a default MessageSource having the parent already set as the custom MessageSource.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I know that this subject has been seen many times here, but I didn't
I know this question has been asked many times, but I am having trouble
I'm sorry if this subject has already been answered, but I couldn't find what
This has been asked once before but that didn't work for me at all.
Sorry if this has been asked elsewhere, but I can't figure this out. I
I know this is a subject that has been well covered here and throughout
I know similar questions have been asked many times befor, but I think this
I know this has probably been answered before, but I cannot find much information
First, I know this question has been asked several times before and that in
I know this has been asked before, but the suggestions in other posts haven't

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.