Coldfusion 8 - конфликт сопоставления вызывает ошибку «аргумент не типа интерфейса» - PullRequest
1 голос
/ 21 января 2012

Я исследовал это и, похоже, ничего не могу найти по этому поводу.

Мы работаем на 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 () внутрифункция ... Похоже, плохая форма.

Спасибо,

Джен

1 Ответ

0 голосов
/ 31 января 2012

Можете ли вы переместить содержимое пакетов, отображаемых вне webroot?Это кажется самым простым способом исправить это.

...