You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Petras (JIRA)" <de...@myfaces.apache.org> on 2016/06/23 08:22:16 UTC

[jira] [Created] (MYFACES-4055) Localized JSF error and information messages not displayed

Petras created MYFACES-4055:
-------------------------------

             Summary: Localized JSF error and information messages not displayed
                 Key: MYFACES-4055
                 URL: https://issues.apache.org/jira/browse/MYFACES-4055
             Project: MyFaces Core
          Issue Type: Bug
          Components: JSR-344
    Affects Versions: 2.2.10
         Environment: Java 8, TomEE 7, Primefaces 6.0, Omnifaces 2.3
            Reporter: Petras


I have localized JSF error and information messages as described in JSR-344 Section "2.5.2.4 Localized Application Messages", which defines how applications may provide own JSF messages,  and prepared resource bundle "javax.faces.Messages". In _faces-config.xml_ I set:
{{<message-bundle>javax.faces.Messages</message-bundle>}}.

But these resources are not always used, when value validation in UI input component fail. Consider the following snippet which illustrates the issue. It contains 2 input text fields, the first one has "required" attribute. The second field is validated using Bean Validation framework:
{code:xml}
<h:form id="form">
    <p:panel header="Validate">
        <h:panelGrid columns="3" cellpadding="5">
            
            <!-- JSF validation -->
            <h:outputLabel for="client1" value="JSF Validation" />
            <h:inputText id="client1" label="JSF Validation" value="#{validationModel.requiredClient}" required="true"/>
            <h:message for="client1" display="both" errorStyle="color: red" />
            
            <!-- Bean validation -->
            <h:outputLabel for="bean0" value="Bean Validation" />
            <h:inputText id="bean0" label="Bean Validation" value="#{validationModel.requiredAnnotated}" />
            <h:message for="bean0" display="both" errorStyle="color: red" />
        </h:panelGrid>

        <!-- submit without ajax -->
        <h:commandButton value="Save" action="#{validationModel.save}" />

        <!-- submit with ajax -->
        <h:commandButton value="Save (ajax)" actionListener="#{validationModel.save}" >
            <f:ajax execute="form" render="form"/>
        </h:commandButton>
    </p:panel>
</h:form>
{code}

The backing bean:
{code:java}
@Named @RequestScoped
public class ValidationModel implements DecisionProcessable {

    @NotNull @Length(min = 1, max = 64)
    private String requiredAnnotated;

    private String requiredClient;

    // getters and setters

    public void save() {
        System.out.println(this);
    }
}
{code}

If I click the button "Save", which performs full submit, I get localized error message. If I click "Save (ajax)", which performs partial submit with ajax, the JSF validation error message is not localized.

I did some debugging and noticed that validation logic uses {{_MessageUtils}} class to obtain resource bundle for the messages, but this utility class uses FacesContext class ClassLoader to find resource bundle. The problem is that this ClassLoader does not always refer to web application classloader. When the partial submit is performed, it refers to Tomcat common classloader, which surely does not see web application resources.

The fix probably would be the same as implemented in {{MessageUtils}}, which uses Thread.currentThread().getContextClassLoader() on ResourceBundle (MYFACES-338).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)