Tapestry 5
  1. Tapestry 5
  2. TAP5-1141

Type coercion from arbitrary object to Boolean will NPE when the object's toString() returns null (should coerce to false)

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 5.2.0
    • Fix Version/s: 5.2.0
    • Component/s: tapestry-ioc
    • Labels:

      Description

      <div t:type="if" test="user.homePhoneNumber"> Home: $

      {user.homePhoneNumber}

      </div>

      Results in:

      Render queue error in BeginRender[PersonalDetails:if_1]: Failure reading parameter 'test' of component PersonalDetails:if_1: Coercion of null to type java.lang.Boolean (via Object --> String, String --> Boolean) failed: java.lang.NullPointerException

      org.apache.tapestry5.ioc.services.TapestryIOCModule$15.coerce(TapestryIOCModule.java:255)
      org.apache.tapestry5.ioc.services.TapestryIOCModule$15.coerce(TapestryIOCModule.java:252)
      org.apache.tapestry5.ioc.services.CoercionTuple$CoercionWrapper.coerce(CoercionTuple.java:51)
      org.apache.tapestry5.ioc.internal.services.CompoundCoercion.coerce(CompoundCoercion.java:45)
      org.apache.tapestry5.ioc.internal.services.TypeCoercerImpl$TargetCoercion.coerce(TypeCoercerImpl.java:72)
      org.apache.tapestry5.ioc.internal.services.TypeCoercerImpl.coerce(TypeCoercerImpl.java:137)
      org.apache.tapestry5.internal.transform.ParameterWorker$2$1.readFromBinding(ParameterWorker.java:282)
      org.apache.tapestry5.internal.transform.ParameterWorker$2$1.get(ParameterWorker.java:381)
      org.apache.tapestry5.corelib.components.If.test(If.java:45)
      org.apache.tapestry5.corelib.base.AbstractConditional.beginRender(AbstractConditional.java:59)
      org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$Invoker.invoke(RenderPhaseMethodWorker.java:117)

      I think the special case of null -> String needs to allow for a null object coerced to a (null) String.

        Activity

        Hide
        Howard M. Lewis Ship added a comment -

        add(configuration, String.class, Boolean.class, new Coercion<String, Boolean>()
        {
        public Boolean coerce(String input)

        { String trimmed = input.trim(); if (trimmed.equalsIgnoreCase("false") || trimmed.length() == 0) return false; // Any non-blank string but "false" return true; }

        });

        This code assumes input is not null.

        Show
        Howard M. Lewis Ship added a comment - add(configuration, String.class, Boolean.class, new Coercion<String, Boolean>() { public Boolean coerce(String input) { String trimmed = input.trim(); if (trimmed.equalsIgnoreCase("false") || trimmed.length() == 0) return false; // Any non-blank string but "false" return true; } }); This code assumes input is not null.
        Hide
        Howard M. Lewis Ship added a comment -

        Takes some ugly code for this to be triggered ... an object's toString() must return null, which is generally a no-no.

        Show
        Howard M. Lewis Ship added a comment - Takes some ugly code for this to be triggered ... an object's toString() must return null, which is generally a no-no.

          People

          • Assignee:
            Howard M. Lewis Ship
            Reporter:
            Howard M. Lewis Ship
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development