2017-02-14 4 views
3

Надеюсь, это момент «DOH», но я не могу понять, почему это происходит. Я использую объект службы, чтобы получить членов группы в API каталога Google. После создания объекта службы я использовал следующие строки для проверкиПеременная дамп показывает данные, но возвращает как неопределенные

<cfset themembers = groupservice.members().list("[My Group Key]").execute()> 
<cfdump var="#themembers#"> 
<cfoutput> 
    Isnull? #isNull(themembers.etag)#<br /> 
    SKExists? #structKeyExists(themembers,"etag")#<br /> 
    Is Defined? #isDefined("themembers.etag")# 
</cfoutput> 

Результирующий выходной код выглядит следующим образом screenshot

Глядя на свалку, я могу видеть, что есть данные в области Etag, а также массив членов. Однако, когда я попытался вывести значение ключа, я получил неопределенную ошибку. Я написал тестовую выходную строку, и она отображается как NULL и не определена, пока ключ существует.

Как это возможно, когда дамп переменной ясно показывает данные? Что мне здесь не хватает?

@Leigh

<cfdump var="#groupservice.members()#"> 
<cfdump var="#groupservice.members().list('[groupkey]')#"> 

Ниже представлен список отвалы из 2-х линий выше. Метод list просто возвращает имя groupkey, которое я передаю, - только после запуска метода execute я фактически получаю список участников (вывод на первом изображении), но точно так же, как с etag - он говорит мне, что члены не определены , sshot1

+0

Так что же на самом деле содержат (строка, число, класс, ...)? Можете ли вы сбросить список 'groupservice.members(). (« [Мой групповой ключ] »), чтобы мы могли видеть подпись метода' execute() '? В предположении, что «пользователи», вероятно, не являются структурой CF в строгом смысле. Большинство функций структуры принимают любой сложный объект, но результаты могут быть не такими же, как с «реальными» структурами. – Leigh

+0

Какая строка кода вызывает ошибку? –

+0

Кроме того, он может не применяться здесь, но ... возможно, что существует «ключ» структуры, но «значение» этого ключа «null» или undefined. – Leigh

ответ

2

Короткий ответ:

Видимо это подпадает под общим правилом "Никогда не доверяйте 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) 
+0

TYVM - вызов соответствующего метода getproperty() явно сделал трюк. Нужно держать «CFDUMP иногда ложь» в банках памяти для дальнейшего использования. –

Смежные вопросы