Я исследовал это и, похоже, ничего не могу найти по этому поводу.
Мы работаем на CF8.Когда мой коллега попытался установить мои последние обновления кода, он начал видеть ошибки, связанные с тем, что аргумент, предоставленный функции, не относится к указанному типу интерфейса.Работал нормально для меня.То же самое.Иногда это работает для него.Также есть проблема на нашем сервере разработки.
С тех пор я смог локализовать и воспроизвести проблему локально.
Вот установка.
У меня есть 2 сопоставленияна сервере:
- "webapp /" идет в c: \ webroot \
- "packages /" идет в c: \ webroot \ [domain]
Затем я создал интерфейс, назвал его ISubject и компонент, который его реализует, назвал Person, и сохранил оба в пакетах.Вот объявление для Person:
cfcomponent implements="packages.ISubject"
Наконец, есть компонент SubjectMediator с функцией setSubject, которая хочет объект типа интерфейса ISubject.Вот объявление аргумента для setSubject:
cfargument name="subject_object" type="packages.ISubject"
Для реализации:
variables.person = createObject("component", "packages.Person").Init();
variables.subjectMediator = createObject("component", "packages.SubjectMediator ").Init();
variables.subjectMediator.setSubject(variables.person);
Эта последняя строка выдает ошибку, что Person не относится к типу ISubject.Если я выполняю isInstanceOf () для Person против ISubject, это подтверждает правильность.
Так, по какой причине это происходит?Дамп getMetaData (variables.person) показывает, что путь интерфейса - это webapp. [Domain] .ISubject.И действительно, если я изменю атрибут типа аргумента, чтобы использовать этот путь вместо пакетов. Субъект, все снова в порядке.
Кажется, что Coldfusion произвольно выбирает, к какому сопоставлению разрешить интерфейс, а затем простоделать сравнение строк для проверки аргумента типа?
Кто-нибудь должен был с этим бороться?Мне нужно сопоставление веб-приложения, и я не могу изменить все ссылки на «пакеты» на «веб-приложение. [Домен]».В этом случае я также не могу использовать привязку приложения к веб-приложению.Хотя любой из этих 3 вариантов может обойти эту проблему, я надеюсь, что у кого-то есть понимание ...
Лучшее, что у меня есть, это установить тип аргумента в значение "any", а затем проверить isInstanceOf () внутрифункция ... Похоже, плохая форма.
Спасибо,
Джен