myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Matthias Wessendorf" <mat...@apache.org>
Subject Re: JSF and converters, possible bug in myfaces and RI
Date Tue, 10 Jul 2007 17:09:37 GMT
are you sure

for-class register "Alternative" is same than JaxB ?

full qualified class name ?

On 7/10/07, Erlend Hamnaberg <erlenha@underdusken.no> wrote:
> 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
>
>


-- 
Matthias Wessendorf

further stuff:
blog: http://matthiaswessendorf.wordpress.com/
mail: matzew-at-apache-dot-org

Mime
View raw message