[
https://issues.jboss.org/browse/AS7-6262?page=com.atlassian.jira.plugin.s...
]
Stan Silvert commented on AS7-6262:
-----------------------------------
I think this may be a case where it was working incorrectly before but is now fixed.
The problem seems to be that the code was actually adding the converter at the wrong time.
The first problem is that on SelectColors, the event is only processed when it is not a
postback. That only happens the first time you hit the page. The second problem is that
SelectColors is listening for PreRenderViewEvent. At that point in the lifecycle, add()
has been called on the Basket, but the corresponding SelectColors component has not been
created.
I fixed the app by changing two lines in SelectColors.java. First, I changed the
processEvent method to add the converter when it IS processing a postback:
{code}
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException
{
if ( FacesContext.getCurrentInstance().isPostback() ) {
addSelectionConverter();
}
}
{code}
Second, I changed the constructor to listen for PostAddToViewEvent instead of
PreRenderViewEvent.
{code}
public SelectColors() {
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot root = context.getViewRoot();
root.subscribeToViewEvent( PostAddToViewEvent.class, this );
}
{code}
Again, I'm not sure why it worked before 2.1.16. Do you want me to look into it
further?
Dynamically added JSF converter ignored in some cases since Mojarra
2.1.16 upgrade
----------------------------------------------------------------------------------
Key: AS7-6262
URL:
https://issues.jboss.org/browse/AS7-6262
Project: Application Server 7
Issue Type: Bug
Components: JSF
Affects Versions: 7.1.4.Final (EAP)
Environment: Current 7.1.4.Final-SNAPSHOT (2013-01-02 be583f5)
Reporter: Marek Schmidt
Assignee: Stan Silvert
Fix For: 7.1.4.Final (EAP)
Attachments: AS7-6262.tar.gz, AS7-6262.war
Dynamically created converters seems to be ignored in some special cases, like the
following.
Having a form like this:
{code}
<h:form>
<ul>
<ui:repeat value="#{basket.items}" var="i">
<li>Item #{i.number}
<h:selectOneMenu value="#{i.color}">
<test:selectColors />
</h:selectOneMenu>
</li>
</ui:repeat>
</ul>
<div>
<h:commandButton value="Add" action="#{basket.add}"
/>
</div>
<h:outputText value="#{basket.string}" />
</h:form>
{code}
Where SelectColors is
{code}
@JsfComponent(description=(a)Description(displayName="org.jboss.seam.test.SelectColors",value="Creates
a List<SelectItem> of colors."),
family="javax.faces.SelectItems",
type="org.jboss.seam.test.SelectColors",generate="org.jboss.seam.test.html.HtmlSelectColors",
tag = @Tag(baseClass="javax.faces.webapp.UIComponentTagBase",
name="selectColors"))
public class SelectColors extends javax.faces.component.UISelectItems implements
SystemEventListener {
public SelectColors() {
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot root = context.getViewRoot();
root.subscribeToViewEvent( PreRenderViewEvent.class, this );
}
@Override
public Object getValue() {
List<SelectItem> ret = new LinkedList<SelectItem> ();
ret.add(new SelectItem("default", "Select color... (black by
default)"));
ret.add(new SelectItem("red", "Red"));
ret.add(new SelectItem("white", "White"));
ret.add(new SelectItem("blue", "Blue"));
ret.add(new SelectItem("black", "Black"));
return ret;
}
private void addSelectionConverter() {
UIComponent parentComponent = getParent();
if (parentComponent instanceof ValueHolder) {
ValueHolder parentValueHolder = (ValueHolder) parentComponent;
Converter parentConverter = parentValueHolder.getConverter();
if (parentConverter == null) {
parentValueHolder.setConverter(new DefaultColorConverter());
}
}
}
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException
{
if ( !FacesContext.getCurrentInstance().isPostback() ) {
addSelectionConverter();
}
}
@Override
public boolean isListenerForSource(Object source)
{
return ( source instanceof UIViewRoot );
}
}
{code}
and the DefaultColorConverter being:
{code}
@FacesConverter(value="org.jboss.seam.test.DefaultColorConverter")
public class DefaultColorConverter implements Converter
{
public static final String DEFAULT_COLOR = "black";
public Object getAsObject(FacesContext context, UIComponent component, String value)
throws ConverterException
{
if ("default".equals(value)) {
return DEFAULT_COLOR;
}
return value;
}
public String getAsString(FacesContext context, UIComponent component, Object value)
throws ConverterException
{
return value.toString();
}
}
{code}
In the pre-Mojarra 2.1.16 upgrade, clicking on the add button repeatedly creates
"black" items. Post mojarra 2.1.16, it sets the color to "default",
which should never happen, as the converter should convert the "default" value
into "black".
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira