You can also do what I did and just contribute a brand new expression evaluator: public class NullSafeExpressionEvaluator extends ExpressionEvaluatorImpl { private static Logger log = Logger.getLogger( NullSafeExpressionEvaluator.class); private static final String START_BRACKET = "{"; private static final String ESCAPED_BRACKET = START_BRACKET; private static final String END_BRACKET = ESCAPED_BRACKET; public Object readCompiled(Object target, Object expression){ Object result = null; try{ result = super.readCompiled(target, expression); } catch (ApplicationRuntimeException e){ if (!(e.getRootCause() instanceof NullPointerException)) result = ""; // don't do anything! } return result; } }
HIVEMIND: <!-- override OGNL evaluator to use more null friendly one --> <implementation service-id="tapestry.ognl.ExpressionEvaluator"> <invoke-factory> <construct class="com.mypackage.NullSafeExpressionEvaluator"> <set-object property="applicationSpecification" value="infrastructure:applicationSpecification"/> <set-configuration property="contributions" configuration-id="PropertyAccessors"/> <set-configuration property="nullHandlerContributions" configuration-id="NullHandlers"/> </construct> </invoke-factory> </implementation> On 1/31/07, andyhot <[EMAIL PROTECTED]> wrote:
Gentry, Michael (Contractor) wrote: > I get an error trying to contribute to tapestry.ognl.NullHandlers ... > Is that available in T4? Thanks! > Damn, that's 4.1 only... If you're on 4.0.x, you can still do this, but you'll have to register the handlers on your own. You just have to call OgnlRuntime's static method at a convenient time, i.e. on app startup OgnlRuntime.setNullHandler(subjectClass, handler); That's exactly what happens in http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ExpressionEvaluatorImpl.java?view=markup > > The electronic mail message you have received and any files transmitted > with it are confidential and solely for the intended addressee(s)'s > attention. Do not divulge, copy, forward, or use the contents, > attachments, or information without permission of Fannie Mae. > Information contained in this message is provided solely for the purpose > stated in the message or its attachment(s) and must not be disclosed to > any third party or used for any other purpose without consent of Fannie > Mae. If you have received this message and/or any files transmitted with > it in error, please delete them from your system, destroy any hard > copies of them, and contact the sender. > > > -----Original Message----- > From: andreas a [mailto:[EMAIL PROTECTED] On Behalf Of andyhot > Sent: Tuesday, January 30, 2007 12:15 PM > To: Tapestry users > Subject: Re: Tapestry prop: suggestion (or question) > > Gentry, Michael (Contractor) wrote: > >> I've downloaded and tried out the prop: prefix extension from HLS. >> > One > >> thing I was *really* hoping for, compared to OGNL, is that it would >> ignore null pointers, at least on reads. >> > > OGNL has a feature called NullHandlers > > You contribute one to configuration point tapestry.ognl.NullHandlers > like this > <null-handler class="class.having.null.properties" > object="instance:org.MyNullHandler"/> > > where MyNullHandler implements > http://www.ognl.org/2.6.9/Documentation/javadoc/ognl/NullHandler.html > > So, if you have a RegisterPage that contains a path like > user.department.name you have > to register null handlers (could be the same one) for the following : > RegisterPage (cause its user may be null), > User (cause his department may be null) > > > > > >> I have report-type pages >> (read-only) where I can sometimes have thousands of rows with 10-15 >> columns. Each of those columns currently has bulky cover methods >> > which > >> do NPE protection in case a relationship is missing (the actual values >> almost always come from a dotted path: foo.bar.baz.status, and OGNL >> > will > >> blow up if "bar" is null). I was hoping the prop: extension would >> handle this, but it seems to work just like OGNL if it hits a null. >> > If > >> something doesn't exist, I'm pretty happy with just getting a null >> > back > >> and displaying nothing. >> >> I played with the code a bit and this seems to work if you edit >> PropertyAccessorBinding.java and change the getObject() method: >> >> public Object getObject() >> { >> return _accessor.readProperty(); >> } <http://www.len.ro/work/articles/tapestry-ajax-application-1/> >> >> to: >> >> public Object getObject() >> { >> try >> { >> return _accessor.readProperty(); >> } >> catch (NullPointerException exception) >> { >> // Ignore NPE on reads ... >> return null; >> } >> } >> >> A) Does this seem like a reasonable thing to do? >> B) If yes to A, could it maybe be included in the actual prop: package >> (would beat maintaining a separate branch). >> >> Thanks! >> >> /dev/mrg >> >> PS. I didn't alter setObject() ... I'd consider that an actual error >> > if > >> you were trying to set things through nulls. >> >> >> The electronic mail message you have received and any files >> > transmitted > >> with it are confidential and solely for the intended addressee(s)'s >> attention. Do not divulge, copy, forward, or use the contents, >> attachments, or information without permission of Fannie Mae. >> Information contained in this message is provided solely for the >> > purpose > >> stated in the message or its attachment(s) and must not be disclosed >> > to > >> any third party or used for any other purpose without consent of >> > Fannie > >> Mae. If you have received this message and/or any files transmitted >> > with > >> it in error, please delete them from your system, destroy any hard >> copies of them, and contact the sender. >> >> >> >> >> >> > > > -- 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]