You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Steve Peterson (JIRA)" <de...@myfaces.apache.org> on 2005/12/30 21:54:03 UTC

[jira] Updated: (MYFACES-990) Unhelpful stack trace when tag value binding returns wrong type.

     [ http://issues.apache.org/jira/browse/MYFACES-990?page=all ]

Steve Peterson updated MYFACES-990:
-----------------------------------

    Attachment: typed-value-binding.patch

This patch modifies every standard component implementation to change the logic behind typed references to the result of evaluating value bindings.  The evaluation result is tested to determine whether it matches the expected type, and, if not, an EvaluationException is thrown giving the component's ID, the binding, the expected type, and the actual returned type.  The most common changes were Boolean, Number, and Converter results.  Value bindings that returned Object or String were not modified.

These changes rely on a new helper method _ComponentUtils.getTypedValue() in both javax.faces.Component and javax.faces.component.Html to do the work of testing the resulting type and throw the exception.  Note that this code is identical in both packages, which seems to be the pattern for this helper class.

> Unhelpful stack trace when tag value binding returns wrong type.
> ----------------------------------------------------------------
>
>          Key: MYFACES-990
>          URL: http://issues.apache.org/jira/browse/MYFACES-990
>      Project: MyFaces
>         Type: Improvement
>   Components: Implementation
>     Versions: 1.1.1
>     Reporter: Steve Peterson
>     Priority: Minor
>  Attachments: typed-value-binding.patch
>
> In the implementation of each UIComponent, the canonical logic for retrieving a non-String property is to cast the result
> of the valueBinding.getValue() method to the expected type.
>     public boolean isItemDisabled()
>     {
>         if (_itemDisabled != null) return _itemDisabled.booleanValue();
>         ValueBinding vb = getValueBinding("itemDisabled");
>         Boolean v = vb != null ? (Boolean)vb.getValue(getFacesContext()) : null;
>         return v != null ? v.booleanValue() : DEFAULT_ITEMDISABLED;
>     }
> Yields an obscure stack trace that doesn't yield the ID of the component or the property that is being referenced:
> ERROR 14:45:28 [[jsp]] Servlet.service() for servlet jsp threw exception
> java.lang.ClassCastException: java.lang.String
>         at javax.faces.component.html.HtmlInputText.isDisabled(HtmlInputText.java:117)
>         at org.apache.myfaces.renderkit.html.HtmlTextRendererBase.isDisabled(HtmlTextRendererBase.java:157)
>         at org.apache.myfaces.renderkit.html.ext.HtmlTextRenderer.isDisabled(HtmlTextRenderer.java:45)
>         at org.apache.myfaces.renderkit.html.HtmlTextRendererBase.renderInput(HtmlTextRendererBase.java:144)
>         at org.apache.myfaces.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:50)
>         at org.apache.myfaces.renderkit.html.ext.HtmlTextRenderer.renderNormal(HtmlTextRenderer.java:72)
>         at org.apache.myfaces.renderkit.html.ext.HtmlTextRenderer.encodeEnd(HtmlTextRenderer.java:58)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira