Re: Validation Being Called Twice
Jeff Dunnett <[email protected]>
| Newsgroups | gmane.comp.web.webobjects.devel |
|---|---|
| Message-ID | <[email protected]> |
First of all thanks for answering my question.
>
> It looks like you have told EOF that your firstName and lastName
> cannot be NULL.
> After your form is posted, WO will call validateTakeValueForKey
> (maybe a bit different spelling) which
> will do the validation for every key in your EO.
>
> Once you save your EditingContext those validating is done again.
>
> Set a breakpoint in your validation code and print the back trace.
>
> HTH
>
> Dave
Ok added some stack dumps to my code:
First before I call the save changes that calls the validation code:
try{
logger.debug("Stack dump 1 - ");
Thread.dumpStack();
ec.saveChanges();
}catch(Exception e){
logger.debug(e);
s.setErrorMessage(e.getMessage());
ec.revert();
return null;
}
Then I added some code to produce stack dump in the validation code:
public String validateHPostal(String value) throws
NSValidation.ValidationException {
logger.debug("Stack dump 2 - ");
Thread.dumpStack();
logger.debug("Value - " + value);
String str = value;
logger.debug("String - " + str);
if (str == null || str.length() == 0 ){
logger.debug("Value is null so we are throwing exception");
logger.debug(value);
throw new NSValidation.ValidationException("PostalCode cannot be
left blank.");
}else if( Pattern.matches("[A-Z][0-9][A-Z][0-9][A-Z][0-9]",
str.subSequence(0, str.length()))){
logger.debug("The string matches a Canadian postal code");
return str = str.substring(0,3) + " " + str.substring(3,6);
}else if(Pattern.matches("[A-Z][0-9][A-Z] [0-9][A-Z][0-9]",
str.subSequence(0, str.length())) || Pattern.matches("[0-9]{5}(-[0-9]
{4})?", str.subSequence(0, str.length()))){
logger.debug("The string is a Postal Code or Zip Code");
return str;
}else{
logger.debug("Stack dump 3 - ");
Thread.dumpStack();
logger.debug("We are throwing an exception because the
registrant did not provide a valid Canadian postal code");
throw new NSValidation.ValidationException("You must
provide a valid Canadian postal code or American zip code");
}
}
Here is the log output:
2007-02-15 11:20:33,310 [WorkerThread4] DEBUG Registrant - Stack dump
2 -
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1176)
at Registrant.validateHPostal(Registrant.java:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
com.webobjects.foundation._NSReflectionUtilities._invokeMethodOnObject
(_NSReflectionUtilities.java:383)
at com.webobjects.foundation.NSValidation
$_MethodBinding.validateValueOnObject(NSValidation.java:615)
at com.webobjects.foundation.NSValidation
$DefaultImplementation._validateValueForKey(NSValidation.java:705)
at
com.webobjects.eocontrol.EOCustomObject.validateValueForKey
(EOCustomObject.java:1341)
at com.webobjects.foundation.NSValidation
$Utility.validateValueForKey(NSValidation.java:526)
at com.webobjects.foundation.NSValidation
$DefaultImplementation.validateTakeValueForKeyPath(NSValidation.java:
729)
at
com.webobjects.eocontrol.EOCustomObject.validateTakeValueForKeyPath
(EOCustomObject.java:1363)
at com.webobjects.foundation.NSValidation
$Utility.validateTakeValueForKeyPath(NSValidation.java:551)
at com.webobjects.foundation.NSValidation
$DefaultImplementation.validateTakeValueForKeyPath(NSValidation.java:
741)
at
com.webobjects.appserver.WOComponent.validateTakeValueForKeyPath
(WOComponent.java:1273)
at
com.webobjects.appserver._private.WOKeyValueAssociation.setValue
(WOKeyValueAssociation.java:71)
at
com.webobjects.appserver._private.WOTextField.takeValuesFromRequest
(WOTextField.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at
com.webobjects.appserver._private.WOForm.takeValuesFromRequest
(WOForm.java:70)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at
com.webobjects.appserver._private.WOComponentContent.takeValuesFromReque
st(WOComponentContent.java:20)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at com.webobjects.appserver.WOComponent.takeValuesFromRequest
(WOComponent.java:914)
at
com.webobjects.appserver._private.WOComponentReference.takeValuesFromReq
uest(WOComponentReference.java:97)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at com.webobjects.appserver.WOComponent.takeValuesFromRequest
(WOComponent.java:914)
at com.webobjects.appserver.WOSession.takeValuesFromRequest
(WOSession.java:1139)
at
com.webobjects.appserver.WOApplication.takeValuesFromRequest
(WOApplication.java:1350)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedPage(WOComponentRequestHandler.java:189)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedSession(WOComponentRequestHandler.java:287)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedApplication(WOComponentRequestHandler.java:322)
at
com.webobjects.appserver._private.WOComponentRequestHandler._handleReque
st(WOComponentRequestHandler.java:358)
at
com.webobjects.appserver._private.WOComponentRequestHandler.handleReques
t(WOComponentRequestHandler.java:432)
at com.webobjects.appserver.WOApplication.dispatchRequest
(WOApplication.java:1306)
at com.webobjects.appserver._private.WOWorkerThread.runOnce
(WOWorkerThread.java:173)
at com.webobjects.appserver._private.WOWorkerThread.run
(WOWorkerThread.java:254)
at java.lang.Thread.run(Thread.java:613)
2007-02-15 11:20:33,314 [WorkerThread4] DEBUG Registrant - Value - 4345
2007-02-15 11:20:33,314 [WorkerThread4] DEBUG Registrant - String - 4345
2007-02-15 11:20:33,315 [WorkerThread4] DEBUG Registrant - Stack dump
3 -
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1176)
at Registrant.validateHPostal(Registrant.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
com.webobjects.foundation._NSReflectionUtilities._invokeMethodOnObject
(_NSReflectionUtilities.java:383)
at com.webobjects.foundation.NSValidation
$_MethodBinding.validateValueOnObject(NSValidation.java:615)
at com.webobjects.foundation.NSValidation
$DefaultImplementation._validateValueForKey(NSValidation.java:705)
at
com.webobjects.eocontrol.EOCustomObject.validateValueForKey
(EOCustomObject.java:1341)
at com.webobjects.foundation.NSValidation
$Utility.validateValueForKey(NSValidation.java:526)
at com.webobjects.foundation.NSValidation
$DefaultImplementation.validateTakeValueForKeyPath(NSValidation.java:
729)
at
com.webobjects.eocontrol.EOCustomObject.validateTakeValueForKeyPath
(EOCustomObject.java:1363)
at com.webobjects.foundation.NSValidation
$Utility.validateTakeValueForKeyPath(NSValidation.java:551)
at com.webobjects.foundation.NSValidation
$DefaultImplementation.validateTakeValueForKeyPath(NSValidation.java:
741)
at
com.webobjects.appserver.WOComponent.validateTakeValueForKeyPath
(WOComponent.java:1273)
at
com.webobjects.appserver._private.WOKeyValueAssociation.setValue
(WOKeyValueAssociation.java:71)
at
com.webobjects.appserver._private.WOTextField.takeValuesFromRequest
(WOTextField.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at
com.webobjects.appserver._private.WOForm.takeValuesFromRequest
(WOForm.java:70)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at
com.webobjects.appserver._private.WOComponentContent.takeValuesFromReque
st(WOComponentContent.java:20)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at com.webobjects.appserver.WOComponent.takeValuesFromRequest
(WOComponent.java:914)
at
com.webobjects.appserver._private.WOComponentReference.takeValuesFromReq
uest(WOComponentReference.java:97)
at
com.webobjects.appserver._private.WODynamicGroup.takeChildrenValuesFromR
equest(WODynamicGroup.java:81)
at
com.webobjects.appserver._private.WODynamicGroup.takeValuesFromRequest
(WODynamicGroup.java:89)
at com.webobjects.appserver.WOComponent.takeValuesFromRequest
(WOComponent.java:914)
at com.webobjects.appserver.WOSession.takeValuesFromRequest
(WOSession.java:1139)
at
com.webobjects.appserver.WOApplication.takeValuesFromRequest
(WOApplication.java:1350)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedPage(WOComponentRequestHandler.java:189)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedSession(WOComponentRequestHandler.java:287)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedApplication(WOComponentRequestHandler.java:322)
at
com.webobjects.appserver._private.WOComponentRequestHandler._handleReque
st(WOComponentRequestHandler.java:358)
at
com.webobjects.appserver._private.WOComponentRequestHandler.handleReques
t(WOComponentRequestHandler.java:432)
at com.webobjects.appserver.WOApplication.dispatchRequest
(WOApplication.java:1306)
at com.webobjects.appserver._private.WOWorkerThread.runOnce
(WOWorkerThread.java:173)
at com.webobjects.appserver._private.WOWorkerThread.run
(WOWorkerThread.java:254)
at java.lang.Thread.run(Thread.java:613)
2007-02-15 11:20:33,318 [WorkerThread4] DEBUG Registrant - We are
throwing an exception because the registrant did not provide a valid
Canadian postal code
[2007-02-15 11:20:33 EST] <WorkerThread4> Validation failed on an
object [java.lang.String] with keypath = registrant.hPostal and
exception: You must provide a valid Canadian postal code or American
zip code
[2007-02-15 11:20:33 EST] <WorkerThread4> Validation failed on an
object [null] with keypath = aGuest.firstName and exception: the
first name field cannot be left blank.
[2007-02-15 11:20:33 EST] <WorkerThread4> Validation failed on an
object [null] with keypath = aGuest.lastName and exception: the last
name field cannot be left blank.
2007-02-15 11:20:33,358 [WorkerThread4] DEBUG RegistrationPage -
***********We are calling saveRegistration***********
2007-02-15 11:20:33,373 [WorkerThread4] DEBUG RegistrationPage -
Stack dump 1 -
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1176)
at RegistrationPage.saveRegistration(RegistrationPage.java:331)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at KeyValueCodingProtectedAccessor.methodValue
(KeyValueCodingProtectedAccessor.java:54)
at com.webobjects.foundation.NSKeyValueCoding
$_MethodBinding.valueInObject(NSKeyValueCoding.java:1160)
at com.webobjects.foundation.NSKeyValueCoding
$DefaultImplementation.valueForKey(NSKeyValueCoding.java:1268)
at com.webobjects.appserver.WOComponent.valueForKey
(WOComponent.java:1539)
at com.webobjects.foundation.NSKeyValueCoding
$Utility.valueForKey(NSKeyValueCoding.java:498)
at com.webobjects.foundation.NSKeyValueCodingAdditions
$DefaultImplementation.valueForKeyPath(NSKeyValueCodingAdditions.java:
212)
at com.webobjects.appserver.WOComponent.valueForKeyPath
(WOComponent.java:1600)
at
com.webobjects.appserver._private.WOKeyValueAssociation.valueInComponent
(WOKeyValueAssociation.java:46)
at
com.webobjects.appserver._private.WOSubmitButton.invokeAction
(WOSubmitButton.java:59)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at
com.webobjects.appserver._private.WOConditional.invokeAction
(WOConditional.java:55)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at com.webobjects.appserver._private.WOForm.invokeAction
(WOForm.java:82)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at
com.webobjects.appserver._private.WOComponentContent.invokeAction
(WOComponentContent.java:31)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at com.webobjects.appserver.WOComponent.invokeAction
(WOComponent.java:945)
at
com.webobjects.appserver._private.WOComponentReference.invokeAction
(WOComponentReference.java:104)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at com.webobjects.appserver.WOComponent.invokeAction
(WOComponent.java:945)
at com.webobjects.appserver.WOSession.invokeAction
(WOSession.java:1168)
at com.webobjects.appserver.WOApplication.invokeAction
(WOApplication.java:1375)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedPage(WOComponentRequestHandler.java:196)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedSession(WOComponentRequestHandler.java:287)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedApplication(WOComponentRequestHandler.java:322)
at
com.webobjects.appserver._private.WOComponentRequestHandler._handleReque
st(WOComponentRequestHandler.java:358)
at
com.webobjects.appserver._private.WOComponentRequestHandler.handleReques
t(WOComponentRequestHandler.java:432)
at com.webobjects.appserver.WOApplication.dispatchRequest
(WOApplication.java:1306)
at com.webobjects.appserver._private.WOWorkerThread.runOnce
(WOWorkerThread.java:173)
at com.webobjects.appserver._private.WOWorkerThread.run
(WOWorkerThread.java:254)
at java.lang.Thread.run(Thread.java:613)
2007-02-15 11:20:33,394 [WorkerThread4] DEBUG Registrant - Stack dump
2 -
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1176)
at Registrant.validateHPostal(Registrant.java:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
com.webobjects.foundation._NSReflectionUtilities._invokeMethodOnObject
(_NSReflectionUtilities.java:383)
at com.webobjects.foundation.NSValidation
$_MethodBinding.validateValueOnObject(NSValidation.java:615)
at com.webobjects.foundation.NSValidation
$DefaultImplementation._validateValueForKey(NSValidation.java:705)
at
com.webobjects.eocontrol.EOCustomObject.validateValueForKey
(EOCustomObject.java:1341)
at com.webobjects.eocontrol.EOCustomObject.validateForSave
(EOCustomObject.java:1411)
at com.webobjects.eocontrol.EOCustomObject.validateForInsert
(EOCustomObject.java:1473)
at com.webobjects.eocontrol.EOEditingContext.validateTable
(EOEditingContext.java:2249)
at
com.webobjects.eocontrol.EOEditingContext.validateChangesForSave
(EOEditingContext.java:3029)
at
com.webobjects.eocontrol.EOEditingContext._prepareForPushChanges
(EOEditingContext.java:3283)
at com.webobjects.eocontrol.EOEditingContext.saveChanges
(EOEditingContext.java:3213)
at RegistrationPage.saveRegistration(RegistrationPage.java:332)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at KeyValueCodingProtectedAccessor.methodValue
(KeyValueCodingProtectedAccessor.java:54)
at com.webobjects.foundation.NSKeyValueCoding
$_MethodBinding.valueInObject(NSKeyValueCoding.java:1160)
at com.webobjects.foundation.NSKeyValueCoding
$DefaultImplementation.valueForKey(NSKeyValueCoding.java:1268)
at com.webobjects.appserver.WOComponent.valueForKey
(WOComponent.java:1539)
at com.webobjects.foundation.NSKeyValueCoding
$Utility.valueForKey(NSKeyValueCoding.java:498)
at com.webobjects.foundation.NSKeyValueCodingAdditions
$DefaultImplementation.valueForKeyPath(NSKeyValueCodingAdditions.java:
212)
at com.webobjects.appserver.WOComponent.valueForKeyPath
(WOComponent.java:1600)
at
com.webobjects.appserver._private.WOKeyValueAssociation.valueInComponent
(WOKeyValueAssociation.java:46)
at
com.webobjects.appserver._private.WOSubmitButton.invokeAction
(WOSubmitButton.java:59)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at
com.webobjects.appserver._private.WOConditional.invokeAction
(WOConditional.java:55)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at com.webobjects.appserver._private.WOForm.invokeAction
(WOForm.java:82)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at
com.webobjects.appserver._private.WOComponentContent.invokeAction
(WOComponentContent.java:31)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at com.webobjects.appserver.WOComponent.invokeAction
(WOComponent.java:945)
at
com.webobjects.appserver._private.WOComponentReference.invokeAction
(WOComponentReference.java:104)
at
com.webobjects.appserver._private.WODynamicGroup.invokeChildrenAction
(WODynamicGroup.java:101)
at
com.webobjects.appserver._private.WODynamicGroup.invokeAction
(WODynamicGroup.java:110)
at com.webobjects.appserver.WOComponent.invokeAction
(WOComponent.java:945)
at com.webobjects.appserver.WOSession.invokeAction
(WOSession.java:1168)
at com.webobjects.appserver.WOApplication.invokeAction
(WOApplication.java:1375)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedPage(WOComponentRequestHandler.java:196)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedSession(WOComponentRequestHandler.java:287)
at
com.webobjects.appserver._private.WOComponentRequestHandler._dispatchWit
hPreparedApplication(WOComponentRequestHandler.java:322)
at
com.webobjects.appserver._private.WOComponentRequestHandler._handleReque
st(WOComponentRequestHandler.java:358)
at
com.webobjects.appserver._private.WOComponentRequestHandler.handleReques
t(WOComponentRequestHandler.java:432)
at com.webobjects.appserver.WOApplication.dispatchRequest
(WOApplication.java:1306)
at com.webobjects.appserver._private.WOWorkerThread.runOnce
(WOWorkerThread.java:173)
at com.webobjects.appserver._private.WOWorkerThread.run
(WOWorkerThread.java:254)
at java.lang.Thread.run(Thread.java:613)
I guess I should give you more information....The class that this
validation method exist is in called Registrant and can have a
relationship with another EO object called Guest. In this case
firstName and lastName come from the Guest object. The problem is I
have checked my model (and even the database table) and firstName and
lastName in the Guest class are allowed to be null. I am not sure
why it is throwing exceptions for the firstName and lastName. The
Registrant EO object does not require a relationship to a Guest
object. In this case I am not even creating a Guest object. Again
thanks for you help.
Regards,
Jeff
_______________________________________________
WebObjects-dev mailing list
[email protected]
http://www.omnigroup.com/mailman/listinfo/webobjects-dev