Hello there,
I must be missing something very obvious now.
My application (rather complex) lately started sometimes to go stack overflow.
I have found the culprit is a code where I call storedValueForKey in my own
ERXGenericRecord subclass. The stack goes like this:
(i) handleQueryWithUnboundKey (which my EO overrides) get called -- I do some
internal checking there, and eventually call my own installed accessor,
essentially, 'this.foo()'. That works well.
(ii) the 'foo' accessor contains just "this.storedValueForKey('foo')", and it
indeed gets called all right.
(iii) now, I thought it would try to get the value of 'foo' from snapshot, or
fetch it from the database, or whatever. I was wrong -- it goes again to
handleQueryWithUnboundKey, GOTO (i), stack overflow.
Here's the important part of backtrack:
===
...
at
cz.ocs.model.OCSEnterpriseObject.handleQueryWithUnboundKey(OCSEnterpriseObject.groovy:1173)
at
com.webobjects.foundation.NSKeyValueCoding$Utility.handleQueryWithUnboundKey(NSKeyValueCoding.java:494)
at
com.webobjects.foundation.NSKeyValueCoding$_KeyBinding.valueInObject(NSKeyValueCoding.java:894)
at
com.webobjects.eocontrol.EOCustomObject.storedValueForKey(EOCustomObject.java:1634)
at
com.webobjects.eocontrol.EOKeyValueCoding$storedValueForKey.call(Unknown Source)
at cz.ocs.model.OCSEOUtilities$FOO_ACCESSOR(OCSEOUtilities.groovy:60)
...
at
cz.ocs.model.OCSEnterpriseObject.handleQueryWithUnboundKey(OCSEnterpriseObject.groovy:1173)
...
===
It even is documented thus, EOCustomObject.storedValueForKey tries first _foo
and foo, then... yadda yadda ... and if all fails, it is documented to go
handleTakeValueForUnboundKey (which seems to be a typo in documentation,
meaning handleQueryWithUnboundKey instead):
===
...
public Object storedValueForKey(String key)
Returns the value for the property identified by key. This method is used when
the value is retrieved for storage in an object store (generally, this is
ultimately in a database) or for inclusion in a snapshot. The default
implementation provided by EOCustomObject is similar to the implementation of
valueForKey, but it resolveskey with a different method instance variable
search order:
• Searches for a private accessor method based on key (a method
preceded by an underbar). For example, with a key of "lastName",
storedValueForKey looks for a method named _getLastName or _lastName.
• If a private accessor isn't found, searches for an instance
variable based on key and returns its value directly. For example, with a key
of "lastName",storedValueForKey looks for an instance variable named _lastName
or lastName.
• If neither a private accessor or an instance variable is
found, storedValueForKey searches for a public accessor method based on key.
For the key "lastName", this would be getLastName or lastName.
• If key is unknown, storedValueForKey calls
handleTakeValueForUnboundKey.
...
===
But darn, _where_ then is the specific EOF code to get the attribute value from
snapshot/from database? So far I thought EOCustomObject overrides the generic
storedValueForKey appropriately (so that instead of trying _foo, _getFoo, foo
and getFoo it reads from snapshot/database). It does not seem to, though?!?
What am I missing here?!?
Thanks a lot,
OC
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]