Короткий ответ:
Видимо это подпадает под общим правилом "Никогда не доверяйте CFDump Иногда это ложь." Дело в том, что переменная themembers
на самом деле не является структурой. Это пример класса Members. Вместо того чтобы использовать точечную нотацию, попробуйте вызвать соответствующие методы класса:
<cfset eTag = themembers.getETag()>
<cfset membersArray = themembers.getMembers()>
..
Longer Ответ:
Хотя CFDump является хорошим инструментом отладки, он имеет тенденцию в пользу «довольно презентации» за правильностью, так что вы не всегда можете доверять тому, что видите. Причина, по которой он отображает themembers
в качестве «структуры», заключается в том, что ColdFusion automatically matches Java types to ColdFusion types. Если вы посмотрите на иерархию классов Members, вы увидите, что она реализует java.util.Map (через AbstractMap), которая автоматически сопоставляется с структурой CF. Следовательно, почему CFDump (вводит в заблуждение) отображает его как один.
- com.google.api.services.admin.directory.model.Members
- com.google.api.client.json.GenericJson
- com.google.api.client.util.GenericData
- java.util.AbstractMap
- java.lang.Object
Хотя объекты java подобны структурам, в некоторых отношениях они не одно и то же. Таким образом, результаты определенных функций могут отличаться от результатов, которые вы обычно ожидаете от структур, что и произошло здесь. т. е. вы можете просмотреть некоторые имена свойств, как вы можете, с помощью структурных ключей, но вы не можете напрямую получить доступ к значениям ключ/свойство.
Тем не менее, технически вы должны смогли получить доступ к свойствам «eTag» и «members» с точечной нотацией. Причина в том, что CF применяет немного синтаксического сахара к определенным объектам java, чтобы обеспечить прямой доступ к свойствам с использованием точечной нотации. Как если бы они были регулярными структурными ключами.
ColdFusion может автоматически вызывать get_PropertyName_() и set_PropertyName_ (значение) методы, если класс Java соответствует шаблону JavaBeans.В результате вы можете установить или получить свойство по , ссылаясь на него напрямую, без явного вызова метода.
Однако, как отмечают в дальнейшем документы, есть некоторые исключения. Этот класс кажется одним из них. Поэтому вам нужно будет вызвать соответствующий метод get PropertyName() явно. В конечном счете, это, вероятно, лучшая практика, так как прямой доступ не всегда работает.
Пример:
// Simulate Members object
obj = createObject("java", "com.google.api.services.admin.directory.model.Members").init();
// Initialize property values
obj.setEtag("If you are seeing this text, it worked.");
obj.setMembers([]);
writeOutput("<br>IsNull? "& isNull(obj.etag));
writeOutput("<br>Key List: "& structKeyList(obj));
writeOutput("<br>Exists? "& structKeyExists(obj, "etag"));
writeOutput("<br>IsDefined? "& IsDefined("obj.etag"));
writeOutput("<br>getETag(): "& obj.getETag());
writeDump(var=obj.getMembers(), label="getMembers()");
Результаты:
IsNull? YES
Key List: etag,members
Exists? YES
IsDefined? NO
getETag(): If you are seeing this text, it worked.
getMembers(): (empty array)
Так что же на самом деле содержат (строка, число, класс, ...)? Можете ли вы сбросить список 'groupservice.members(). (« [Мой групповой ключ] »), чтобы мы могли видеть подпись метода' execute() '? В предположении, что «пользователи», вероятно, не являются структурой CF в строгом смысле. Большинство функций структуры принимают любой сложный объект, но результаты могут быть не такими же, как с «реальными» структурами. – Leigh
Какая строка кода вызывает ошибку? –
Кроме того, он может не применяться здесь, но ... возможно, что существует «ключ» структуры, но «значение» этого ключа «null» или undefined. – Leigh