I got the warning in the log file when I have used the tag <h:outputLabel> without attribute "for" in xhtml file. It was really polluting my server log files.
The logged information actually makes sense anyway! We could find an answer as the following:
"Having h:outputLabel without a "for" attribute is meaningless. If you are not attaching the label, you should be using h:outputText instead of h:outputLabel."
However, these solutions are not possible just for my situation. Instead of using h:outputText for only displaying text, my team has used h:outputLabel too many places. We were nearly in our release time (next day) so it is quite risky and takes much efforts if we try to correct it. Because the style (with CSS) is already done with h:ouputLabel. The alternative by adding attribute "for" the existing h:outputLabel is not reasonable either. I really need to find another solution.
Fortunately, I came across a way if I change to use p:outputLabel, the warning won't be logged! What?
I was just curious to know why; so then I decided to delve into the implementation of outputLabel of both Primefaces and Myfaces source code (at grepcode.com). I found the reason is:In Myfaces (1.2.2), we can easily to find the line of code below in method "encodeBegin" in class "HtmlLabelRenderer". It is executed whether the attribute "for" is null.
log.warn("Attribute 'for' of label component with id "
+ uiComponent.getClientId(facesContext)+" is not defined");
However, Primefaces (5.2) does not. In class "OutputLabelRenderer", it uses the default implementation of method "encodeBegin" from superclass without logging. Ahh! The method "encodeBegin" is just a hook!
Okay! The reason is clear. I saw that the only difference of HTML rendering between h:outputLabel and p:outputLabel is as below:
1. <h:ouputLabel> will be rendered to become <label>
2. <p:outputLabel> will be rendered to become <label class="ui-outputlabel">
It should be an acceptable approach to fix the issue in my case. I just do a little bit more with style and I can achieve my goal without spending much efforts for testing whole the application again. Yeah!
Something like this:
1. XHTML
<h:panelGroup layout="block" styleClass="child-add-ons-container">
<ul>
<li>
<h:panelGroup layout="block" styleClass="type-of-check">
<p:outputLabel value="bonity"></p:outputLabel>
</h:panelGroup>
<li>
....
<ul>
</h:panelGroup>
2. CSS: just make sure the style of p:outputLabel is the same with current style of h:outputLabel, for example:
.add-ons-compliance-check .type-of-check label.ui-outputlabel {
font-style: normal; /*style of tag label in our app*/
color: inherit; /*style of tag label in our app*/
font: inherit; /*style of tag label in our app*/
}
References
[1]. http://stackoverflow.com/questions/12744264/attribute-for-of-label-error
[2]. http://docs.oracle.com/javaee/5/javaserverfaces/1.2/docs/tlddocs/h/outputLabel.html
[3]. http://grokbase.com/t/myfaces/users/143vdzqp11/how-to-disable-label-warnings
[4]. http://grepcode.com/file/repo1.maven.org/maven2/org.primefaces/primefaces/5.2/org/primefaces/component/outputlabel/OutputLabelRenderer.java?av=f
[5]. http://grepcode.com/file/repository.springsource.com/org.apache.myfaces/com.springsource.org.apache.myfaces/1.2.2/org/apache/myfaces/renderkit/html/HtmlLabelRenderer.java?av=f