(Sorry for top posting, but everybody else seems to do it on this list)
Anyway, the null pointer exception in a long property access chain was
one of the issues I had with OGNL a while ago and have basically just
learned to live with it. It is highly annoying. One of the things I
preferred with Apple's WebObjects (which used NSKeyValueCoding for
property access expressions) was that if any object in the chain was
null, it just returned null. So if you have the expression:
a.b.c.d
where c is null, the entire expression would evaluate to null. Having to
implement some sort of hivemind null pointer handling service just to
get this sort of behaviour just screams "over designed" to me.
(Not that I'm knocking OGNL/Tapestry in general, I still prefer using it
over WebObjects for a variety of reasons).
Damien
Martino Piccinato wrote:
In my opinion is all that you want is not having NullPointerException it
would be better to implement MethodAccessor and/or PropertyAccessor, that
would return null if the target object is null, then you could simply check
expressions returning nulls and returning your message, or maybe have a
special component doing this.
Tapestry has configuration point also for default Method/Property accessors.
On 7/26/07, Marcos Chicote <[EMAIL PROTECTED]> wrote:
Responding to my own mail...
I found an old Andreas mail to the lis (
http://mail-archives.apache.org/mod_mbox/tapestry-dev/200606.mbox/[EMAIL
PROTECTED]
)
that explained how to do this.
I'll sumarize my ideas so that I can check if they are correct and maybe
it
will result usefull to the next person that wants to do this.
The idea is to define a class that implements NullHandler (
http://www.ognl.org/2.6.9/Documentation/javadoc/ognl/NullHandler.html).
That class job is to handle null's when an specific class access to
property
returns null.
To make tapestry use your NullHandler you define something like this in
your hivemind configuration file:
<contribution configuration-id="tapestry.ognl.NullHandlers">
<null-handler class="classThatImplementsNullHandler"
object="instance:classToCaptureNulls"/>
</contribution>
where classToCaptureNulls represents the name of the class who's nulls you
want to handle and classThatImplementsNullHandler represents the class
that
knows how to deal with nulls in classToCaptureNulls.
Now that I have this working I would like to know how to use it :D
I mean, if I have a long ognl expression like obj1.obj2.obj3.obj4 and
access
to obj2 in obj1 return null, I would like to show an "obj2 not available"
message on screen.
Can anyone help me on how to use this service?
Thanks!
Marcos
On 7/26/07, Marcos Chicote <[EMAIL PROTECTED]> wrote:
Hi Andreas!
When I emailed to Tapestry's list I was prototyping a project. Now I'm
actually developing it and I'm very interested in getting this service
working.
Did you find some code where you used this feature?
Thanks!
Marcos
On 6/29/07, Marcos Chicote <[EMAIL PROTECTED]> wrote:
Thanks Andreas.
I have to do some more reading then.
I you have some code that I can use as an example I would be really
grateful.
Thanks!
Marcos
On 6/29/07, Andreas Andreou < [EMAIL PROTECTED]> wrote:
O/H Marcos Chicote έγραψε:
Thanks Andreas.
Before mailing to this list, I tried looking at the ognl
documentation
and I
found the NullHandler interface but I wasn't sure how it worked
with
Tapestry or if it was possible to do it another way without
altering
the
BOs.
Correct me if I'm wrong but what I understand is that Tapestry
already
implements a Hivemind service that does the null handling. All I
have
to do
is make my BOs implement NullHandler interface. Am I right?
Hmmm, not really... Tapestry simply provides that point so that your
have a global
way of registring handlers - so, making your BOs implement
NullHandler
is not enough
Also, i'm not sure if that's the correct approach - seems it polutes
your BOs
I think I'd create a service that would be able to null-handle your
specific objects, and
esp. of all those objects have a common superclass, i'd be able to
register them all at once.
I'll dig in for some code - it's been a while since i last used this
Thanks a lot!
Marcos
On 6/29/07, Andreas Andreou <[EMAIL PROTECTED]> wrote:
http://tapestry.apache.org/tapestry4.1/tapestry-framework/hivedoc/config/tapestry.ognl.NullHandlers.html
the way it works, is that you associate implementations of
http://www.ognl.org/2.6.9/Documentation/javadoc/ognl/NullHandler.html
with class types whose methods (or properties) may return null
O/H Marcos Chicote έγραψε:
Hi!
I have a Table component (actually I have TableRows, TableView,
and
all
those other components that form a Table) and one of the
columns
in
TableView is declared like this: columnName:
object1.object2.property.
As you can see this can throw NullPointerException if either
object1 or
object2 are null.
To solve this problem, I have to alternatives:
a) Use a Block component called columnNameColumnValue an inside
the
block an
Insert component with a value asociated with the page's class
that
handles
nulls
b) Declare the column like: columnName:object1.propertyObject2.
(that
it a
getPropertyObject2 method in object1 class that handles nulls).
Is there a better way to solve this?? I would love something
like
a
prefix
that allows me to specify that whenever a NPE is found, a blank
space is
rendered. Is something like that possible?
I'm ussing Tapestry 4.1.1.
Btw, great work with Tap4.1.2, congratulations!
Thanks!
--
Andreas Andreou - [EMAIL PROTECTED] - http://andyhot.di.uoa.gr
Tapestry / Tacos developer
Open Source / J2EE Consulting
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
Andreas Andreou - [EMAIL PROTECTED] - http://andyhot.di.uoa.gr
Tapestry / Tacos developer
Open Source / J2EE Consulting
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]