You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Matthias Weßendorf (JIRA)" <de...@myfaces.apache.org> on 2009/05/22 09:54:45 UTC

[jira] Commented: (MYFACES-2099) Detection of empty selection in UISelectOne through RenderUtils.NOTHING is faulty

    [ https://issues.apache.org/jira/browse/MYFACES-2099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12711980#action_12711980 ] 

Matthias Weßendorf commented on MYFACES-2099:
---------------------------------------------

can you add this to myfaces 2.0 ?

> Detection of empty selection in UISelectOne through RenderUtils.NOTHING is faulty
> ---------------------------------------------------------------------------------
>
>                 Key: MYFACES-2099
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2099
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 1.1.7-SNAPSHOT, 1.2.6-SNAPSHOT
>         Environment: All
>            Reporter: Andreas Watermeyer
>            Assignee: Leonardo Uribe
>             Fix For: 1.1.7-SNAPSHOT, 1.2.7-SNAPSHOT
>
>
> RendererUtils.getConvertedUIOutputValue() throws an IllegalArgumentException because it does not recognize RendererUtils.NOTHING (see stacktrace below).
> Problem is the following code, taken from RendererUtils.getConvertedUIOutputValue():
> public static Object getConvertedUIOutputValue(FacesContext facesContext,
>                                                    UIOutput output,
>                                                    Object submittedValue)
>         throws ConverterException {
> if (submittedValue != null && !(submittedValue instanceof String)) {
>             if (RendererUtils.NOTHING.equals(submittedValue)) {
>                 return null;
>             }
>             throw new IllegalArgumentException("Submitted value of type String for component : " +
>                 getPathToComponent(output) + "expected");
> }
> Problem: In my case "submittedValue" *is* an instance of RendererUtils.NOTHING. However, this is not recognized by the above code because it was serialized. 
> As one can see at the declaration of RendererUtils.NOTHING, it is intentionally Serializable. Unfortunately the detection of the value works only for not-serialized values.
> Possible solution: Implement RendererUtils.NOTHING.equals() to recognize serialized versions of RendererUtils.NOTHING.
> Application Background (Further explanation of the context):
> During "apply request values" the component gets RendererUtils.NOTHING assigned as "submittedValue". Usually the submitted value is resetted in the "process validations" phase. But in this case "process validations" is never executed because FacesContext.renderResponse() is called earlier. So, the submitted value (= RendererUtils.NOTHING) remains in the component, gets serialized. On the next round trip the component doesnt receive a "process decodes" because it is disabled, but "process validations" is called on the component, which fails with the attached stack trace.
> ---------
> Stacktrace:
> java.lang.IllegalArgumentException: Submitted value of type String for component : {.....} expected
> 	org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedUIOutputValue(RendererUtils.java:591)
> 	org.apache.myfaces.shared_impl.renderkit.html.HtmlMenuRendererBase.getConvertedValue(HtmlMenuRendererBase.java:126)
> 	javax.faces.component.UIInput.getConvertedValue(UIInput.java:396)
> 	javax.faces.component.UIInput.validate(UIInput.java:350)
> 	javax.faces.component.UIInput.processValidators(UIInput.java:184)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIForm.processValidators(UIForm.java:73)
> 	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
> 	javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:149)
> 	org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:32)
> 	org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
> 	org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
> 	javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.