Skip to main content

Attribute 'for' of label component with id xxxx is not defined


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

Comments

Popular posts from this blog

What the heck is Meteor DDP?

I was using Meteor for my messenger project. I was so curious about the real time connection. I wanted to know how exactly this mechanism works. In this post, I will go through the DDP Specification, an overview of WebSocket, and a simple demo about how to subscribe a publication of Rocket.Chat (containing a DDP server) from an external webpage. At a glance, I knew that Meteor invented a protocol called DDP which uses for handling real time connection. So then, what is DDP? "DDP (Distributed Data Protocol) is the stateful WebSocket protocol that Meteor uses to communicate between the client and the server." [1] All right! Why does DDP matter? "DDP is a standard way to solve the biggest problem facing client-side JavaScript developers: querying a server-side database, sending the results down to the client, and then pushing changes to the client whenever anything changes in the database" . [2] In order to understand deeply the protocol, I decided ...

JSF 2 - Dynamically manipulating the component tree with system events

Let's suppose we want to modify the metadata (attributes)  of elements such as render , requried , maxlength but we do not define in JSF tags. The manipulating components can be conducted in Drools  files, for example. How could we do? I think that is what we need to change something of component tree during JSF life-cycle. JSF supports event handling throughout the JSF life-cycle. In this post, I use two events: postAddToView for scanning components tree and preRenderView for manipulating the meta of components before rendering to GUI. I modified my own project from previous post for this example. This is my first further JSF trying out with the project as I said before. :) We define the tags f:event below the form - a container component of the components which we want to work on. The valid values for the attribute type for f:event can be found from tag library document  of JSF 2. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" x...

Regex - Check a text without special characters but German, French

Special characters such as square brackets ([ ]) can cause an exception " java.util.regex.PatternSyntaxException " or something like this if we don't handle them correctly. I had met this issue. In my case, my customers want our application should allow some characters in German and French even not allow some special characters. The solution is that we limit the allowed characters by showing the validation message on GUI. For an instance, the message looks like the following: "This field can't contain any special characters; only letters, numbers, underscores (_), spaces and single quotes (') are allowed." I used Regular Expression to check it. For entering Germany and French, I actually don't have this type of keyboard, so I referred these sites: * German characters: http://german.typeit.org/ * French characters: http://french.typeit.org/ Here is my code: package vn.nvanhuong.practice; import java.util.regex.Matcher; import java.util...

Junit - Test fails on French or German string assertion

In my previous post about building a regex to check a text without special characters but allow German and French . I met a problem that the unit test works fine on my machine using Eclipse, but it was fail when running on Jenkins' build job. Here is my test: @Test public void shouldAllowFrenchAndGermanCharacters(){ String source = "ÄäÖöÜüß áÁàÀâÂéÉèÈêÊîÎçÇ"; assertFalse(SpecialCharactersUtils.isExistSpecialCharater(source)); } Production code: public static boolean isExistNotAllowedCharacters(String source){ Pattern regex = Pattern.compile("^[a-zA-Z_0-9_ÄäÖöÜüß áÁàÀâÂéÉèÈêÊîÎçÇ]*$"); Matcher matcher = regex.matcher(source); return !matcher.matches(); } The result likes the following: Failed tests: SpecialCharactersUtilsTest.shouldAllowFrenchAndGermanCharacters:32 null A guy from stackoverflow.com says: "This is probably due to the default encoding used for your Java source files. The ö in the string literal in the J...

Building a Wizard with Chain of Responsibility Pattern

What is the Idea? We want to create a page that there are some steps and each step has its own business. Users are able to click on a step and its status could be changed. Primefaces owns a component " Wizard " but it it quite hard for us in order to apply our very specific and complicated business domain logic on each step; even we cannot click on a step of this component. We somehow are able to use the component " TabView " works with a strong back-end mechanism. A backend mechanism! what do I mean? Yes, we need it because we want to abstract the behaviors of each step otherwise we will get trouble with many events handling. Obviously, each step has some behaviors  such as "next", "back" and "switch' are the same and they are related to each other; but the business of these behaviors can be different totally. That is where the pattern "Chain of Responsibility" can be applied. Step by Step Building It! In this simple pr...