Hey,

I have a question concerning where validation should be performed, and
what people feel best practices are. Specifically, I have a number of
business objects that validate parameters supplied to their setters
for correctness, and throw IllegalArgumentExceptions if something is
invalid. For example, in a hypothetical Person class I would have:

    ...
    public void setAge(int age) {
        if (age < 0) throw new MyInvalidValueException("some i18n-ed
error msg");
        this.age = age;
    }
    ....

This is done so that if there is a failure to properly validate at
some other layer of the application, it will fail-fast and allow the
problem to be debugged more easily. (It also gives confidence that all
references to a business object do not contain invalid data.)

Now, we are using Struts2 and intend to use the provided annotations
for validation. The problem is, if I create the app so that HTTP
parameters are set directly on the business objects (by using a 'name'
value of "person.name" for a form field, for example), these
exceptions will prevent the value from being set, so validation is
never performed (and no errors are set on the action).

The way I see it, I have three options:

1) Remove all validity checks from the business objects, and rely on
Struts to validate incoming data, and the DAO layer to validate them
before inserting. This would probably be the simplest option, but I
wanted to get peoples thoughts on it first. Are argument checks like
the ones above a good idea? Or is it better to have these type of
objects be dumb-data transfer objects that will carry any value they
are given?

2) Duplicate all properties of the business objects on the struts
actions, where they can be validated using the validation annotations.
The action methods must then copy the values into the business objects
as needed. This would allow the business objects to remain unchanged,
but has a lot of duplication and maintenance overhead if fields are
added/removed/changed. (It basically reminds me of the nightmare of
Struts1 form beans :p )

3) Extend the ParametersInterceptor and/or validation interceptor to
do some kind of "magic" involving catching the argument exceptions,
setting appropriate errors on the action, and preserving the invalid
values so that they can be redisplayed on the form. This option is
definitely the most work (and I haven't looked at the Struts source
closely enough to know exactly how much is involved, and if its even
possibly to do in an elegant fashion).

So in addition to commenting on the above specific situation, the
general question is this: should business objects be self-validating,
and how should they handle validation errors?

Thanks in advance for any input,
Sean Kleinjung
AV Support, Inc.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to