2017-02-14 2 views
3

Hoffentlich ist dies ein "DOH" Moment, aber ich kann nicht herausfinden, warum das passiert. Ich verwende ein Serviceobjekt, um die Mitglieder einer Gruppe in der Google Directory-API zu erhalten. Nachdem das Dienstobjekt zu schaffen habe ich die folgenden ZeilenVariable Dump zeigt Daten aber kehrt als undefined

<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> 

Die resultierende Ausgabe des Codes wie dies auf der Müllkippe der Suche screenshot

schaut testen ich dort Daten im etag Feld zu sehen ist sowie eine Reihe von Mitgliedern. Als ich jedoch versuchte, den Schlüsselwert auszugeben, bekam ich einen undefinierten Fehler. Ich habe eine Testausgangszeile geschrieben, die als NULL angezeigt wird und nicht definiert ist, solange der Schlüssel existiert.

Wie ist das möglich, wenn der Dump der Variablen Daten eindeutig anzeigt? Was fehlt mir hier?

@Leigh

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

Hier sind die Deponien von den zwei Zeilen weiter oben. Die Methode list gibt einfach den Namen des Gruppenknopfs zurück, den ich übergebe - erst nachdem ich die execute-Methode ausgeführt habe, bekomme ich die Mitgliederliste (Ausgabe im ersten Bild), aber genau wie beim Etag - es sagt mir, dass Mitglieder nicht definiert sind . sshot1

+0

Also, was bedeutet es tatsächlich enthalten (String, eine Zahl, klasse, ...)? Können Sie die 'groupservice.members(). List (" [My Group Key] ") ablegen, so dass wir die' execute() 'Methodensignatur sehen können? Vermutlich ist "themembers" im engeren Sinne keine CF-Struktur. Die meisten Strukturfunktionen akzeptieren jedes komplexe Objekt, aber die Ergebnisse sind möglicherweise nicht genau die gleichen wie bei "echten" Strukturen .... – Leigh

+0

Was ist die Codezeile, die den Fehler erzeugt? –

+0

Es mag auch nicht hier gelten, aber ... es ist möglich, dass ein Struktur- "Schlüssel" existiert, aber der "Wert" dieses Schlüssels ist "null" oder undefiniert. – Leigh

Antwort

2

Kurze Antwort:

Anscheinend fallen unter die allgemeine Regel "Nie cfdump vertrauen Manchmal liegt es." In diesem Fall ist die Variable themembers nicht wirklich eine Struktur. Es ist eine Instanz der Klasse Members. Statt Punktnotation verwenden, versuchen Sie die relevanten Methoden der Klasse aufrufen:

<cfset eTag = themembers.getETag()> 
<cfset membersArray = themembers.getMembers()> 
.. 

Längere Antwort:

Während cfdump ein gutes Debugging-Tool ist, neigt sie dazu, „ziemlich Präsentation“ über die Genauigkeit zu begünstigen, Sie können also nicht immer darauf vertrauen, was Sie sehen. Der Grund, warum es themembers als "struct" anzeigt, ist, weil ColdFusion automatically matches Java types to ColdFusion types. Wenn Sie sich die Klassenhierarchie von Members ansehen, können Sie sehen, dass sie implementiert java.util.Map (über AbstractMap), die automatisch auf eine CF-Struktur angepasst wird. Deshalb warum CFDump (irreführend) es als eins anzeigt.

Obwohl Java-Objekte Strukturen ähneln, sind sie in mancher Hinsicht nicht das Gleiche. Die Ergebnisse bestimmter Funktionen können sich daher von dem unterscheiden, was Sie normalerweise für Strukturen erwarten würden. Sie können einige Eigenschaftsnamen anzeigen, wie Sie es mit Strukturschlüsseln können, aber Sie können nicht direkt auf die Schlüssel-/Eigenschaftswerte zugreifen.

Das gesagt, technisch Sie sollten in der Lage gewesen sein, auf die "eTag" und "Mitglieder" -Eigenschaften mit Punktnotation zuzugreifen. Der Grund dafür ist, dass CF ein gewisses Maß an syntaktischem Zucker auf bestimmte Java-Objekte anwendet, um den direkten Zugriff auf Eigenschaften mithilfe der Punktnotation zu ermöglichen. So als wären sie normale Strukturschlüssel.

Coldfusion kann automatisch aufrufen get_PropertyName_() und set_PropertyName_ (Wert) Methoden, wenn eine Java-Klasse mit dem Muster JavaBean entspricht.Daher können Sie die Eigenschaft festlegen oder abrufen, indem Sie direkt auf verweisen, ohne eine Methode explizit aufrufen zu müssen.

Allerdings gibt es, wie später in der Dokumentation erwähnt, einige Ausnahmen. Diese Klasse scheint einer von ihnen zu sein. Sie müssen also die entsprechenden Methoden PropertyName() explizit aufrufen. Letztendlich ist das wahrscheinlich die beste Vorgehensweise, da der direkte Zugriff nicht immer funktioniert.

Beispiel:

// 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()"); 

Ergebnisse:

IsNull? YES 
Key List: etag,members 
Exists? YES 
IsDefined? NO 
getETag(): If you are seeing this text, it worked. 
getMembers(): (empty array) 
+0

TYVM - Aufruf der entsprechenden getproperty() -Methode hat den Trick explizit gemacht. Gonna müssen die "CFDUMP manchmal Lügen" in den Speicherbanken für zukünftige Referenz halten. –

Verwandte Themen