Ошибка при передаче списка в функцию, ожидающую числовой аргумент — работало в CF9, но не в CF11.

По какой-то причине (правильной или неправильной) у нас есть объявление функции, например:

<cffunction name="findaccount" access="public" returntype="struct">
    <cfargument name="roles" type="numeric" required="true" default="1">
    ...
</cffunction>

Затем функция вызывается

<cfinvoke method="findaccount" returnvariable="stAccountDetails">
    <cfinvokeargument name="roles" value="1,2">
</cfinvoke>

Несмотря на первоначальное намерение передать список функции, ожидающей числового значения, этот код уже давно работает в CF9. Недавно мы решили перейти на CF11, и код выдает следующее исключение:

Detail: If the component name is specified as a type of this argument, it is possible that either a definition file for the component cannot be found or is not accessible. 
Message: The ROLES argument passed to the findaccount function is not of type numeric. 

При поиске я нашел аналогичную проблему здесь. Мой вопрос: является ли отмена проверки типа аргумента (как предложено Адамом Кэмероном) лучшим обходным путем для моего случая, учитывая, что существует много подобных вызовов?


person sunrise    schedule 24.02.2015    source источник
comment
Я предлагаю изменить тип на строку, потому что это то, что 1,2. Затем проверьте нечисловые значения внутри вашей функции и сделайте то, что вам нужно. Если вас это утешит, у меня также были случаи, когда обновления ColdFusion приводили к поломке далеко не идеального кода. Я нахожу это раздражающим. Если он собирался сломаться, он должен был сделать это немедленно, чтобы я мог что-то сделать в то время.   -  person Dan Bracuk    schedule 24.02.2015


Ответы (1)


Нет, не делай того, что я сказал.

Если вы перейдете по ссылке на обнаруженную мной ошибку (упомянутую в моем ответ), кто-то из Adobe пояснил, что происходит. Это влияет на другую ситуацию, а также на вашу:

В CF 11 был введен новый параметр приложения: strictnumbervalidation = "true|false". По умолчанию значение этого параметра равно "true", что вводит строгую проверку числа. Явная установка этого значения на «false» заставит проверку вести себя по-старому.

person Adam Cameron    schedule 24.02.2015
comment
Интересный. Не знал этого. (Если верить документам, новая настройка приложения влияет IsValid, cfargument, cfparam and cfform. @sunrise. Мне любопытно, как вы использовали его со списками. Судя по тому, что я читал, похоже, что он был разработан, чтобы разрешить определенные типы форматирования чисел, а не произвольные списки чисел. Например, я провел быстрый тест и CF9 принял 1,2,3, но отклонил 1,2,3,5. - person Leigh; 25.02.2015
comment
@ Ли, это потому, что он интерпретирует 1,2,3 как дату (вероятно, 2 января 1903 г.), а затем преобразует ее в число. Но очевидно, хотя 1,2,3 — это дата... 1,2,3,5 — нет. Ты глупый! ;-) - person Adam Cameron; 25.02.2015