Sylvain Wallez wrote:
Reinhard Poetz wrote:

Sylvain Wallez wrote:

Reinhard Poetz wrote:

Vilya Harvey wrote:

Reinhard P�tz wrote:


Imagine following scenario: You have a service layer that is exposed as web services. cForms already does as much validation as possible but some complex checks can only be performed by the backend.


If I call a webservice (via Axis client) this webservice can return errors (how this is done hasn't been defined yet).

Are there any best practices or experiences how to map errors coming from the service or domain layer to cForms widgets? (The error has to appear at widget level.)






In your flowscript, you can create your own ValidationError object and explicitly set that on the apppropriate widget.

What we did was to define our own type of exception which included information about all validation errors that were found, then wrote a simple(-ish) flowscript function which handled looking up the relevant widgets, creating the error objects and setting them into the widgets.





Thank you!

This means that the service layer is aware of which widgets exist? I'm not sure if I (and especially my customer) likes this bi-directional dependency...





Nono! Your validation code has to catch the exception and translate it into a validation error. This means you can have "regular" validation errors (i.e. the backend could be reached but detected invalid data) and communication-level errors, e.g. "could not validate data, try again later".




let's try to express this using some pseudo-code:

var form = new Form(...);
var businessObject = getBusinessObjectFromServiceLayer();
form.load(businessObject);
form.show(...);

form.save(businessObject);
var errorType;
try {
  saveBusinessObjectInBackend(businessObject);
} catch(ex) {
  errorType = ex.getErrorType();
}

if(errorType == "user.already.exists") {
  form.lookupWidget("user").setValidationError("User already exists!");
}

form.show(...);

Do you mean something like this? The problem with this is that the service layer
can return *a lot* of different error types and I would have to write dozens of
ifs ... :-(



You should enclose this in a while loop :

var success = false;
while (!success) {
 form.showForm();
 form.save(obj);
 try {
   saveBusinessObjectInBackend(obj);
   success = true;
 } catch(ex) {
   ...
 }
}

Now about the particular exception handling, you can also define a higher level system to propagate errors with a data structure that associates an error code with a widget name and an error message.

If the validation is separated from the saveInBackend operation, don't forget that you can define a <fd:validation> on the form object itself.

thank you guys!


--
Reinhard P�tz Independant Consultant, Trainer & (IT)-Coach


{Software Engineering, Open Source, Web Applications, Apache Cocoon}

                                       web(log): http://www.poetz.cc
--------------------------------------------------------------------

Reply via email to