1 Reply Latest reply on Jan 23, 2017 10:13 AM by Steve Sommers

    CFML 2016 incompatabilities

    dichi6 Level 1

      I'm trying to migrate from CF9 to CF2016.  It is going pretty smoothly except for a couple of things.


      Keep in mind, the application logic is largely written in Java.  CF is used simply to load and call Java objects and generate UI.


      The problems I've encountered seem to be related in that CF2016 can't seem to find a java method (in our library) that matches the call signature or vice-versa.


      1) ArrayAppend

      This works in CF9 but not in CF2016


      <CFSET Session.Items.ArrayAppend( Session.Items, Session.SubItem)>


      Error in log file is: The ArrayAppend method was not found.Either there are no methods with the specified method name and argument types or the ArrayAppend method is overloaded with argument types that ColdFusion cannot decipher reliably. ColdFusion found 0 methods that match the provided arguments. If this is a Java object and you verified that the method exists, use the javacast function to reduce ambiguity.

      In our library, SubItem is a subtype of Item.


      To work around it, I simply did this:

      <CFSET Session.Items[ Session.ItemsNdx ] = Session.SubItem>


      2) Attributes in custom tag

      This doesn't work in 2016 but does in CF9:


      <CFSET Attributes.items.set( JavaCast( "int", ndx ), item2 )>

      <CFSET Attributes.items.set( JavaCast( "int", ndx + 1 ), item1 )>


      Workaround was this:

      <CFSET Attributes.items.setElementAt( item2 , JavaCast( "int", ndx ) )>

      <CFSET Attributes.items.setElementAt( item1 , JavaCast( "int", ndx + 1 ) )>


      3) Finding the contstructor

      <CFSET foo = CreateObject( "Java", "com.company.Foo" )>

      <CFSET init = foo.init( Session.Thing, Session.Items, version )>


      Seems to be complain about the second argument (Items) with:

      Unable to find a constructor for class com.company.Foo that accepts parameters of type ( com.company.Thing, coldfusion.runtime.Array, java.lang.String ).


      I have no workaround for this yet.  It works if I create a Foo constructor like this: Foo( Thing, version), which eliminates the 2nd argument and adjust the constructor like this: Foo( Thing thing, String  version).


      It seems like CF2016 is having difficulty with arrays (Vectors).  Any ideas?

        • 1. Re: CFML 2016 incompatabilities
          Steve Sommers Level 4

          Just a guess but I'm guessing that you are relying on undocumented features in CF. CF9 may have used the Java array data type as-is whereas CF-2016 uses a "CF" array data type? I've not ever seen scope.array.ArrayAppend() documented in CF; instead CF documents ArrayAppend(). Your first example would be:


               <CFSET ArrayAppend( Session.Items, Session.SubItem) />


          I think your other examples are similar issues:


               <CFSET Attributes.items.setElementAt( item2 , JavaCast( "int", ndx ) )>

          should be:

               <CFSET Attributes.items[ndx] = item2 />


          I'm told there have been significant speed improvement between CF9 & CF-2016 (even CF11) and array and structure handling probably had to change for these improvements. Again, just a guess.