Hi,

maybe I don't understand your problem. But could you add the title in this way?

items.add(new SelectItem("", "Some title"));

if the user selects the title you get a null value I think. So you do not need the converter.
(except tomcat from version 6.0.18 without the zero flag)

lg Marcus

s.pen...@lombardodier.com schrieb:
Hi Jakob,

Actually this change has other implications, like the following one:

In a form, I use a double-SelectManyMenu. One lists all possible values, and the other lists the selected values. Two buttons allow the user to place a value from one menu to the other.

The business values are listed in a java Enum, and use a converter. To make things clearer for our users, the values in the first menu, where all possible values are stored, are separated with two "titles". These elements actually are SelectItems, with a "-1" value, added as follows:

public List<SelectItem> buildComboContentForSomeBusinessValue() {
  List<SelectItem> items = new ArrayList<SelectItem>();
  items.add(new SelectItem("-1","Some title"));
  items.addAll(buildSomeSelectItemsBasedOnMyBusinessValues());
  items.add(new SelectItem("-1","Some other title"));
  items.addAll(buildOtherSelectItemsBasedOnMyBusinessValues());
  return items;
}

My converter does the following:
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) throws ConverterException {

  if ("-1".equals( s)) {
    return null;
  }
  return MyBusinessEnum.valueOf( s);
}
(and the same in the other way round, Enum -> String)

This way, if the user selects one of the titles, we do nothing with it. But if the user selects one of the real business values, then it is processed, added to a list, etc... This behavior used to work with version 1.1.2, and does not anymore. That because the converter is not called anymore during the validation. We're comparing for equality "null" and "-1" which would map to the same value if the converter was called, but are obviously different without conversion. From where I stand, the validation process should not take the responsability to decide if objects are the same or not when a converter is involved, but should delegate the conversion to the converter before testing for equality.

I now have two options: add the titles to the business enum, which is ugly, or find a way to make the validation work again as it used to... If you think about it, quite a lot of people add elements in a business menus. Think of the "All" or "None" options that many menus display. In that case, I guess (or... hope :-) that the developpers do not include "All" and "None" values in their business enums...

Do you have any hints to help me work around this change? Or am I doing something wrong here?

On another topic: since your are following the spec version with the first two digits of MyFaces versions, shouldn't you make it a 4-digits version, with the third incrementing when breaking changes occur, and the fourth incrementing when you are simply patching the code? I'm not opposed to breaking changes in the libs I include in my apps, there's no other way to evolve sometimes... but I'd just like to know when it's going to happen... :-)

Thanks again for your support,
Best regards,

Sébastien







Jakob Korherr <jakob.korh...@gmail.com> Sent by: sethfromaust...@gmail.com 08.03.2010 17:20
Please respond to
"MyFaces Discussion" <users@myfaces.apache.org>



To
MyFaces Discussion <users@myfaces.apache.org>
cc

Subject
Re: Trouble upgrading from 1.1.2 to 1.1.7






Hi Sébastien,

It's great that you were able to figure out the real problem :)

To explain it a little further: the <f:selectItem itemValue="1" .../>
creates a SelectItem with the String value of "1". If you want to provide an
Integer value you have to provide it via a property in a managed bean that
returns the integer 1. maybe also #{1} will work, but I'm not really sure...

I totally agree that there should be a document (wiki-page etc.) that
describes such changes. Unfortunately this was far before my time.. However, if we apply similar changes to MyFaces 2.0, I will write them down on a wiki
page, I promise ;)

Regards,
Jakob

2010/3/8 <s.pen...@lombardodier.com>

Hello Jakob,

Don't worry for the delay, that's great to have support for this kind of
problems :-)

First, I changed all the attributes that did not work to String, so that
the page worked again. Then I chose one of the attributes and tried the
following configurations:

- int property -> KO
- Integer property -> KO
- Integer property and explicit converter:
(javax.faces.convert.IntegerConverter registered in my own
faces-config.xml) -> KO
- String property -> OK

Since the field was mapping to a "greater or smaller than" filter value,
I
had not set the page to display an error corresponding to this field. So
I
added the following line to my JSPX:
<ice:message for="myOperator" styleClass="errorMsg"/>

With this line, I can now see an error message, saying that my value is
not a valid option. Here is how the field is written in the JSPX:

<ice:selectOneMenu value="#{listController.filter.myOperator}" id=
"myOperator">
<f:selectItem itemValue="1" itemLabel="#{msg.search_filter_greater}"
/>
 <f:selectItem itemValue="-1" itemLabel="#{msg.search_filter_less}" />
</ice:selectOneMenu>

I see the call in the IntegerConverter, and can trace it until it is in
the UIInput.java class:

if (!isValid()) return;
validateValue(context, convertedValue);
if (!isValid()) return;

The first call to "isValid()" returns true, and the second call returns
false.

By digging a little bit further, I found this, in UISelectOne.java, in
method "validateValue(FacesContext context, Object value)" :
// selected value must match to one of the available options
if (!_SelectItemsUtil.matchValue(value, new _SelectItemsIterator(this)))
{
 _MessageUtils.addErrorMessage(context, this, INVALID_MESSAGE_ID, new
Object[] {getId()});
 setValid(false);
}

The condition here returns true, meaning that the validation fails. And
ever further down in SelectItemsUtil.java, method "matchValue(Object
value, Iterator selectItemsIter)":
Object itemValue = item.getValue();
if (value==itemValue || (itemValue.equals(value))) {
 return true;
}

In this condition, the Integer value that has just been created is
tested
for equality with the String value that is in the SelectItem. The
validation obviously cannot pass. In version 1.1.2, the same method
contained the following code:

Object itemValue = item.getValue();
if(converter != null && itemValue instanceof String)
{
 itemValue = converter.getConvertedValue(context, (String)itemValue);
}
if (value==itemValue || value.equals(itemValue))
{
 return true;
}

This code changed the value of the variable "itemValue" to the converted
value when a converter was available, and thus tested two Integer
objects
for equality.
I think this explains why setting the property to String works in 1.1.7,
and leaving the property as an int or Integer, as it used to work in
1.1.2, doesn't work anymore.
Searching through MyFaces' JIRA, with a clearer view of the problem lead
me to this issue: [1], which explicitly changed the code that is printed
here above. Several persons pointed out the fact that this change of
behavior would be an upgrade problem for users migrating MyFaces. But
since the change was making MyFaces behave more closer to the RI, I
guess
it made sense to do it anyway.

More generally speaking, I think that somebody at MyFaces should build
and
maintain a document listing all upgrade-breaking changes that are found
as
the development goes on. It is time-consuming to have to diagnose a
problem like I had to do, and seeing that the code has been changed
knowing that it would cause upgrade problems is just plain annoying.
Maybe
this document already exists, but my search for upgrade problems with
MyFaces did not lead me to it.

Anyway, thanks Jakob for your support :-)

Best regards,

Sébastien

[1] http://issues.apache.org/jira/browse/MYFACES-1328







Jakob Korherr <jakob.korh...@gmail.com>
Sent by: sethfromaust...@gmail.com


06.03.2010 09:56
Please respond to
"MyFaces Discussion" <users@myfaces.apache.org>



To
MyFaces Discussion <users@myfaces.apache.org>
cc

Subject
Re: Trouble upgrading from 1.1.2 to 1.1.7






Hi Sébastien,

Sorry for the long delay - I had to learn a lot last week for a
university
exam...

Anyway, the thing with iceSubmit() was just a guess. I thought that
maybe
ICEfaces causes some kind of a wrong submit data or something like that.
However, it really bugs me that this does not work out for you! A
version
upgrade should not be a loss of functionality!

The next thing you/we could take a look at is the conversion mechanism.
Maybe this does not work right, because your String properties work
(right?)
and your int properties don't. Have you tried setting a converter
manually
at the component which is bound to the int property? The standard
integer
converter's class is javax.faces.convert.IntegerConverter.  Altough this
class is registered in the standard-faces-config.xml for type int and
java.lang.Integer, it may not be applied (why ever..).

Another thing you could try is changing the property from the native int
type to java.lang.Integer. Maybe this will work.

Hope this helps!

Regards,
Jakob

2010/3/3 <s.pen...@lombardodier.com>

Hi Jakob,

I guess that the javascript in iceSubmit() might not the cause of the
problem... The int binding that used to work doesn't work anymore, and
this is what caused the interface to "freeze". Correcting the java
code
to
accept a String made the interface work correctly again....

I fail to understand how does the javascript iceSubmit() fits in
this...
but I certainly am not the most knowledgable person on the matter.
Could
you explain what makes you think that the javascript might be a good
suspect?

Since I have a release planned in a quite short time, I won't be able
to
rewrite the whole form using only MyFaces components... sorry about
that... :( But I might have the time to build a sample-app that shows
that
the binding that used to work doesn't work anymore. As I understood
them,
the release notes of MyFaces do not show anything related to this
change
of behavior. Do you think it might be a bug?

Regards,

Sébastien








Jakob Korherr <jakob.korh...@gmail.com>
Sent by: sethfromaust...@gmail.com


02.03.2010 23:39
Please respond to
"MyFaces Discussion" <users@myfaces.apache.org>



To
MyFaces Discussion <users@myfaces.apache.org>
cc

Subject
Re: Trouble upgrading from 1.1.2 to 1.1.7






Hi,

You're welcome ;)

Hmm. Maybe the submitting via the javascript function iceSubmit() does
not
function properly. It's really hard to say from this point of view...

Have you tried using some of the standard MyFaces components (without
ICEFaces)?

Regrads,
Jakob

2010/3/2 <s.pen...@lombardodier.com>

Hello Jakob,

Here is the generated HTML of (a part of) a search form. It includes
a
"Bigger than/smaller than" field that was bound to an int in my Java
code.
The binding was not working anymore, untill I modified the setter of
the
attribute to take a String and converted to an int afterwards (just
as
a
quick way of testing if a String binding would work).

I then changed several other bindings similar to this one to use
Strings,
and the app seems to run way better now :-) but anyway further
testing
will be necessary.

HTML:

<tr class="icePnlGrdRow2">
       <td class="icePnlGrdCol editrQ" id="searchForm:_id1068-1-0">
               <label class="iceOutLbl bold"
for="searchForm:aValueToFilter" id="searchForm:_id1075">Label of the
value
to filter</label>
       </td>

       <td class="icePnlGrdCol editrR" id="searchForm:_id1068-1-1">
               <div class="icePnlGrp" id="searchForm:_id1076">
                       <select style="" class="iceSelOneMnu"
id="searchForm:valueToFilterOperator"
name="searchForm:valueToFilterOperator"
                               onblur="setFocus('');"
onfocus="setFocus(this.id);" size="1">
                         <option value="1">Bigger than or equal
to</option>
                         <option value="-1">Smaller than/option>
                       </select>

                       <input style="" class="iceInpTxt"
id="searchForm:aValueToFilter" name="searchForm:aValueToFilter"
                         onblur="setFocus('');"
onfocus="setFocus(this.id);"
onkeypress="iceSubmit(form,this,event);"
onmousedown="this.focus();"
                         size="15" value="" type="text">
                       <label class="iceOutLbl"
id="searchForm:_id1079">
unit of the value to filter</label>

                       <span id="searchForm:_id1080"></span>
               </div>
       </td>
</tr>

Does it help?

Thanks a lot for your help...

Best regards,

Sébastien








Jakob Korherr <jakob.korh...@gmail.com>
Sent by: sethfromaust...@gmail.com


01.03.2010 17:50
Please respond to
"MyFaces Discussion" <users@myfaces.apache.org>



To
MyFaces Discussion <users@myfaces.apache.org>
cc

Subject
Re: Trouble upgrading from 1.1.2 to 1.1.7






Can you provide some generated HTML (not JSP!!), which includes
components
that do not work. This could be a great help!

Regards,
Jakob

2010/3/1 <s.pen...@lombardodier.com>

Hello,

My guess is that the problem is more general than just a
javascript
issue.
In my previous message, I gave the "form submit" situation only as
an
example. The problem actually touches more than just this: I
cannot
sort
my table content by clicking on one column header, I cannot switch
from
a
StackPanel to another, etc...

By searching a little bit further, I found out that the values
that
I
used
in combo boxes to show a "greater or smaller" choice (for example,
age
greater or smaller than 30) are not bound to their java
counterpart
anymore. For example:

<ice:selectOneMenu value="#{someController.filter.ageOperator}"
id=
"ageOperator">
 <f:selectItem itemValue="1"
itemLabel="#{msg.search_filter_greater}"
/>
<f:selectItem itemValue="-1"
itemLabel="#{msg.search_filter_less}"
/>
</ice:selectOneMenu>

This menu was bound to a Java integer as follows:

private int ageOperator;

With 1.1.7, the value is not bound anymore. I needed to change the
type
of
the attribute in my Java class to String for the binding to work
again.
Is
there a special converter that I should add, which was not needed
in
1.1.2
? I can assure you that this runs fine with 1.1.2 :-)

I am fairly new to MyFaces. Is there something I should do to make
the
upgrade easier?

Thanks a lot for your help :-)

Sébastien







Jakob Korherr <jakob.korh...@gmail.com>
Sent by: sethfromaust...@gmail.com


01.03.2010 12:25
Please respond to
"MyFaces Discussion" <users@myfaces.apache.org>



To
MyFaces Discussion <users@myfaces.apache.org>
cc

Subject
Re: Trouble upgrading from 1.1.2 to 1.1.7






Hi,

Maybe there's a problem with the javascript that submits the form.
I
saw
However this is just a shot in the blue...

Regards,
Jakob

2010/3/1 <s.pen...@lombardodier.com>

Hello,

I am experiencing quite a lot of trouble while upgrading from
MyFaces
1.1.2 to 1.1.7.

My application uses IceFaces 1.8.2, Spring 2.5.2 and Hibernate
3.4.0.
The only thing that I changed in my Maven 2 build is the version
of
MyFaces.
This had an impact on the following jars:

Added:
myfaces-api-1.1.7.jar
myfaces-impl-1.1.7.jar
commons-digester-1.8.jar
commons-beanutils-1.8.0.jar

Removed:
myfaces-api-1.1.2.jar
myfaces-impl-1.1.2.jar
commons-digester-1.6.jar
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar

When I build and deploy my application in Weblogic 9.2.3, the
deploy
goes
fine, but the actions in the app do not work anymore.
More precisely: as soon as I try to use JSF components like if
I
submit
a
form, then nothing happens. This behaviour can be observed with
several
browsers.

I tried to find some upgrading guide but didn't find any guide
related
to
these versions. And since the version change is minor, I
expected
my
application to run fine with the new jars.

I tried also tried to override some jar versions, putting back
the
Digester to version 1.6, and the BeanUtils to version 1.7.0, but
this
didn't change anything. At this point, the only thing that had
changed
in
my EAR were the two MyFaces jars.

Another attempt to find the problem was to upgrade the version
gradually.
I switched to MyFaces 1.1.4, and everything worked fine. That's
when
I
switched to MyFaces 1.1.5 that the problem appeared. However, I
haven't
seen anything in the changes from 1.1.4 to 1.1.5[1] that seems
suspect.
Is there some configuration changes that I might have missed? Or
some
known compatibility problems regarding this upgrade? Again, I
couldn't
find anything precisely related to these versions up to now, but
I'm
still
looking.

Any help would be highly appreciated! :-)

Best regards,

Sébastien

[1]


https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&pid=10600&fixfor=12312310&sorter/field=summary&sorter/order=ASC&sorter/field=resolution&sorter/order=ASC&sorter/field=status&sorter/order=ASC&sorter/field=priority&sorter/order=DESC


************************ DISCLAIMER ************************
This message is intended only for use by the person to
whom it is addressed. It may contain information that is
privileged and confidential. Its content does not
constitute a formal commitment by Lombard Odier
Darier Hentsch & Cie or any of its branches or affiliates.
If you are not the intended recipient of this message,
kindly notify the sender immediately and destroy this
message. Thank You.

*****************************************************************

************************ DISCLAIMER ************************
This message is intended only for use by the person to
whom it is addressed. It may contain information that is
privileged and confidential. Its content does not
constitute a formal commitment by Lombard Odier
Darier Hentsch & Cie or any of its branches or affiliates.
If you are not the intended recipient of this message,
kindly notify the sender immediately and destroy this
message. Thank You.
*****************************************************************


************************ DISCLAIMER ************************
This message is intended only for use by the person to
whom it is addressed. It may contain information that is
privileged and confidential. Its content does not
constitute a formal commitment by Lombard Odier
Darier Hentsch & Cie or any of its branches or affiliates.
If you are not the intended recipient of this message,
kindly notify the sender immediately and destroy this
message. Thank You.
*****************************************************************


************************ DISCLAIMER ************************
This message is intended only for use by the person to
whom it is addressed. It may contain information that is
privileged and confidential. Its content does not
constitute a formal commitment by Lombard Odier
Darier Hentsch & Cie or any of its branches or affiliates.
If you are not the intended recipient of this message,
kindly notify the sender immediately and destroy this
message. Thank You.
*****************************************************************


************************ DISCLAIMER ************************
This message is intended only for use by the person to
whom it is addressed. It may contain information that is
privileged and confidential. Its content does not
constitute a formal commitment by Lombard Odier
Darier Hentsch & Cie or any of its branches or affiliates.
If you are not the intended recipient of this message,
kindly notify the sender immediately and destroy this
message. Thank You.
*****************************************************************




************************ DISCLAIMER ************************
This message is intended only for use by the person to
whom it is addressed. It may contain information that is
privileged and confidential. Its content does not
constitute a formal commitment by Lombard Odier
Darier Hentsch & Cie or any of its branches or affiliates.
If you are not the intended recipient of this message,
kindly notify the sender immediately and destroy this
message. Thank You.
*****************************************************************


Reply via email to