myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Erlend Hamnaberg <erle...@underdusken.no>
Subject JSF and converters, possible bug in myfaces and RI
Date Tue, 10 Jul 2007 16:45:44 GMT
Hello.

Last time i posted i didnt get much response from this question.

I have even changed to the JSF RI and the same error occurs.

Some background:

I have provided a converter for a class Alternative.
The class Alternative is a Serializable object generated by JaxB.

The generated class:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {

})
@XmlRootElement(name = "alternative", namespace = "http://evatest.org/xml")
public class Alternative
    implements Serializable
{

    private final static long serialVersionUID = 123L;
    @XmlElement(namespace = "http://evatest.org/xml")
    protected ResourceType resource;
    @XmlElement(namespace = "http://evatest.org/xml", required = true)
    protected String text;
    @XmlAttribute
    protected Integer certainty;
    @XmlAttribute(required = true)
    protected int id;
    @XmlAttribute
    protected Double points;
    @XmlAttribute
    protected Integer weight;

    /**
     * Gets the value of the resource property.
     *
     * @return
     *     possible object is
     *     {@link ResourceType }
     *    
     */
    public ResourceType getResource() {
        return resource;
    }

    /**
     * Sets the value of the resource property.
     *
     * @param value
     *     allowed object is
     *     {@link ResourceType }
     *    
     */
    public void setResource(ResourceType value) {
        this.resource = value;
    }

    /**
     * Gets the value of the text property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *    
     */
    public String getText() {
        return text;
    }

    /**
     * Sets the value of the text property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *    
     */
    public void setText(String value) {
        this.text = value;
    }

    /**
     * Gets the value of the certainty property.
     *
     * @return
     *     possible object is
     *     {@link Integer }
     *    
     */
    public int getCertainty() {
        if (certainty == null) {
            return  0;
        } else {
            return certainty;
        }
    }

    /**
     * Sets the value of the certainty property.
     *
     * @param value
     *     allowed object is
     *     {@link Integer }
     *    
     */
    public void setCertainty(Integer value) {
        this.certainty = value;
    }

    /**
     * Gets the value of the id property.
     *
     */
    public int getId() {
        return id;
    }

    /**
     * Sets the value of the id property.
     *
     */
    public void setId(int value) {
        this.id = value;
    }

    /**
     * Gets the value of the points property.
     *
     * @return
     *     possible object is
     *     {@link Double }
     *    
     */
    public double getPoints() {
        if (points == null) {
            return  0.0D;
        } else {
            return points;
        }
    }

    /**
     * Sets the value of the points property.
     *
     * @param value
     *     allowed object is
     *     {@link Double }
     *    
     */
    public void setPoints(Double value) {
        this.points = value;
    }

    /**
     * Gets the value of the weight property.
     *
     * @return
     *     possible object is
     *     {@link Integer }
     *    
     */
    public int getWeight() {
        if (weight == null) {
            return  0;
        } else {
            return weight;
        }
    }

    /**
     * Sets the value of the weight property.
     *
     * @param value
     *     allowed object is
     *     {@link Integer }
     *    
     */
    public void setWeight(Integer value) {
        this.weight = value;
    }

}


this is like this:


public class AlternativeConverter implements Converter {
    private Log log = LogFactory.getLog(getClass());

    public Object getAsObject(FacesContext facesContext, UIComponent 
uiComponent, String string) throws ConverterException {
        if (string == null) return null;
        Alternative a = new Alternative();
        log.debug(string);
        String[] splitted = string.split(";");
        a.setId(Integer.parseInt(splitted[0]));         // id
        a.setText(splitted[1]);                         // text
        a.setWeight(Integer.parseInt(splitted[2]));     // weight
        a.setCertainty(Integer.parseInt(splitted[3]));  // certainty
        log.debug(a.getId() + " " + a.getText() + " " + 
a.getWeight());                                   // resource ?
        return a;
    }

    public String getAsString(FacesContext facesContext, UIComponent 
uiComponent, Object object) throws ConverterException {
        if (object == null || !(object instanceof Alternative)) return null;

        Alternative a = (Alternative) object;
        return String.valueOf(a.getId()) + ";" + a.getText() + ";" + 
a.getWeight() + ";" + a.getCertainty();
    }
}

The converter is registered within faces-context as converter-for-class
I have then created a very basic unit test that verifies that values get 
converted.

Provided here:


public class TestAlternativeConverter extends TestCase {

    private AlternativeConverter alternativeConverter = new 
AlternativeConverter();

   
    public TestAlternativeConverter(String string) {
        super(string);
    }

    @Test
    public void testGetAsObject(){
        String alt = "1;Green;0;100";
        Alternative a = (Alternative) 
alternativeConverter.getAsObject(null, null, alt);
        assertEquals(a.getId(), 1);
    }

    @Test
    public void testGetAsString(){
          Alternative a = new Alternative();
          a.setId(1);
          a.setPoints(2.0);
          a.setCertainty(100);
          a.setText("Green");
          String res = alternativeConverter.getAsString(null, null, a);
          assertEquals("1;Green;0;100", res);
    }
}

I then populate a very simple backing bean with this:

public class TheTestBean {
    private Alternative alternative = new Alternative();
    private Log log = LogFactory.getLog(getClass());

    public Alternative getAlternative() {
        return alternative;
    }



    public void setAlternative(Alternative alternative) {
        this.alternative = alternative;
    }

    public List<SelectItem> getAlternatives() {
        List<SelectItem> list = new LinkedList<SelectItem>();
        for (int i = 1; i < 11; i++) {
            Alternative a = new Alternative();
            a.setId(i);
            a.setText("Text " + i);
            list.add(new SelectItem(a,a.getText()));
        }
        return list;
    }

    public String doSubmit() {
        log.debug(alternative);
        return "ok";
    }
}


  <h:form>
        <h:selectOneRadio id="radiobuttonlist"
                          layout="pageDirection"
                          value="#{theTestBean.alternative}">



            <f:selectItems value="#{theTestBean.alternatives}"/>
        </h:selectOneRadio>
        <t:commandButton value="Submit" action="#{theTestBean.doSubmit}"/>
        </h:form>


The following happens.... Nothing. Validation fails, and there are none 
validators assosiated with the component.

Debug output, from sun ri, the same happens with myfaces, however i 
found that the debug from ri was more helpful.

2007-07-10 18:29:43,910 [btpool0-4] DEBUG 
com.sun.faces.application.StateManagerImpl - Begin creating serialized 
view for /test.xhtml
2007-07-10 18:29:43,910 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@1a6a3c3
2007-07-10 18:29:43,910 [btpool0-4] DEBUG 
com.sun.faces.application.StateManagerImpl - End creating serialized 
view /test.xhtml
2007-07-10 18:29:43,910 [btpool0-4] DEBUG 
com.sun.faces.renderkit.ResponseStateManagerImpl - Compressing state 
before saving..
2007-07-10 18:29:43,927 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RenderResponsePhase - Exiting RenderResponsePhase
2007-07-10 18:29:43,928 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@1a6a3c3
2007-07-10 18:29:47,147 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.LifecycleImpl - 
execute(com.sun.faces.context.FacesContextImpl@139ca7e)
2007-07-10 18:29:47,147 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RestoreViewPhase - Entering RestoreViewPhase
2007-07-10 18:29:47,147 [btpool0-4] DEBUG 
com.sun.faces.application.ViewHandlerImpl - URL pattern of the 
FacesServlet executing the current request .html
2007-07-10 18:29:47,147 [btpool0-4] DEBUG 
com.sun.faces.application.ViewHandlerImpl - viewId after appending the 
context suffix /test.xhtml
2007-07-10 18:29:47,148 [btpool0-4] DEBUG 
com.sun.faces.application.StateManagerImpl - Begin restoring view from 
response /test.xhtml
2007-07-10 18:29:47,150 [btpool0-4] DEBUG 
com.sun.faces.renderkit.ResponseStateManagerImpl - Deflating state 
before restoring..
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.application.StateManagerImpl - End restoring view from 
response /test.xhtml
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RestoreViewPhase - Postback: Restored view for 
/test.html
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RestoreViewPhase - Exiting RestoreViewPhase
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.application.ApplicationImpl - Couldn't find a factory for 
ajaxContext
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:null
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.ApplyRequestValuesPhase - Entering 
ApplyRequestValuesPhase
2007-07-10 18:29:47,161 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,162 [btpool0-4] DEBUG 
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer - Set 
submitted value 4;Text 4;0;0 on component
2007-07-10 18:29:47,162 [btpool0-4] DEBUG 
com.sun.faces.renderkit.html_basic.ButtonRenderer - This command 
resulted in form submission  ActionEvent queued 
javax.faces.event.ActionEvent[source=org.apache.myfaces.component.html.ext.HtmlCommandButton@1718057]
2007-07-10 18:29:47,162 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.ApplyRequestValuesPhase - Exiting 
ApplyRequestValuesPhase
2007-07-10 18:29:47,162 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,162 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.ProcessValidationsPhase - Entering 
ProcessValidationsPhase
2007-07-10 18:29:47,162 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
com.sun.faces.application.ApplicationImpl - Created bean theTestBean 
successfully
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.evatest.web.beans.TheTestBean@a0eb2a
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer - Created 
converter org.evatest.web.converter.AlternativeConverter@af2a50of type 
class org.evatest.xml.Alternative while decoding component radiobuttonlist
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
org.evatest.web.converter.AlternativeConverter - 4;Text 4;0;0
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
org.evatest.web.converter.AlternativeConverter - 4 Text 4 0
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.evatest.web.beans.TheTestBean@a0eb2a
2007-07-10 18:29:47,163 [btpool0-4] DEBUG 
com.sun.faces.context.FacesContextImpl - Adding 
Message[sourceId=_id35:radiobuttonlist,summary=Validation Error: Value 
is not valid)
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.ProcessValidationsPhase - Exiting 
ProcessValidationsPhase
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.LifecycleImpl - 
render(com.sun.faces.context.FacesContextImpl@139ca7e)
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RenderResponsePhase - Entering RenderResponsePhase
2007-07-10 18:29:47,164 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,169 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RenderResponsePhase - About to render view 
/test.xhtml
2007-07-10 18:29:47,169 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,169 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,169 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,169 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,173 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,175 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,175 [btpool0-4] DEBUG 
com.sun.faces.application.ViewHandlerImpl - URL pattern of the 
FacesServlet executing the current request .html
2007-07-10 18:29:47,179 [btpool0-4] DEBUG 
com.sun.faces.application.ApplicationImpl - Couldn't find a factory for 
visit
2007-07-10 18:29:47,179 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:null
2007-07-10 18:29:47,179 [btpool0-4] DEBUG 
com.sun.faces.application.ApplicationImpl - Couldn't find a factory for 
visit
2007-07-10 18:29:47,179 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:null
2007-07-10 18:29:47,179 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,179 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,180 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,180 [btpool0-4] DEBUG 
com.sun.faces.application.ViewHandlerImpl - URL pattern of the 
FacesServlet executing the current request .html
2007-07-10 18:29:47,180 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.evatest.web.beans.TheTestBean@a0eb2a
2007-07-10 18:29:47,183 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,183 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,184 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,184 [btpool0-4] DEBUG 
com.sun.faces.application.StateManagerImpl - Begin creating serialized 
view for /test.xhtml
2007-07-10 18:29:47,184 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d
2007-07-10 18:29:47,184 [btpool0-4] DEBUG 
com.sun.faces.application.StateManagerImpl - End creating serialized 
view /test.xhtml
2007-07-10 18:29:47,184 [btpool0-4] DEBUG 
com.sun.faces.renderkit.ResponseStateManagerImpl - Compressing state 
before saving..
2007-07-10 18:29:47,192 [btpool0-4] DEBUG 
com.sun.faces.lifecycle.RenderResponsePhase - Exiting RenderResponsePhase
2007-07-10 18:29:47,192 [btpool0-4] DEBUG 
com.sun.faces.el.VariableResolverImpl - resolveVariable: Resolved 
variable:org.ajax4jsf.framework.ajax.AjaxContext@19c123d



The funny thing is, when i change the converter to using any of my JPA 
model objects the conversion works, and the validation errors does not 
occur.

Any idea why this is happening? Can it be because of Jaxb ? in that 
case, how.


Regards

Erlend Hamnaberg
Lead Developer Evatest


Mime
View raw message