Re: Proxy null poiter exception with bad references

Armin Waibel <[email protected]>
Newsgroups gmane.comp.jakarta.ojb.user
Message-ID <[email protected]>
Hi Martin,

Martin Heyer wrote:
> Hello Ojb-Users.
> 
> I have a Cocoon + OJB installation running. For performance reasons 
> there is a dynamic Proxy configured with class B. For example let's
> have two classes A and B:
> 
> Class A: (has no proxy) - uid - link  -> points to uid of class B - B
> (foreign key, holds the instance of B associated with link)
> 
> Class B: (has a proxy) - uid - data
> 
> Everything works fine without the proxy. But when proxy is turned on
> and A points to an ID that has no B in the DB, it throws a NPE:
> 
> ... Caused by: org.apache.ojb.broker.PersistenceBrokerException:
> Error invoking method getIndirectionHandler at 
> org.apache.ojb.broker.core.proxy.AbstractIndirectionHandler.invoke(AbstractIndirectionHandler.java:363)
>  at $Proxy29.getIndirectionHandler(Unknown Source) ... 61 more Caused
> by: java.lang.NullPointerException at 
> org.apache.ojb.broker.core.proxy.AbstractIndirectionHandler.invoke(AbstractIndirectionHandler.java:347)
>  ... 62 more
> 
> Is there a way to catch this? I can load A so it has a proxy instance
> of B associated with it. ATM there is no way for me to know if the
> proxy will find a real object of B. When I access this reference, it
> crashes..

This should be fixed in SVN:
http://www.mail-archive.com/ojb-dev%40db.apache.org/msg03485.html

The only "workaround" I know is to patch method
AbstractIndirectionHandler.invoke(Object proxy, Method method, Object[] 
args)

replace:
return method.invoke(subject, args);

with:
if("toString".equals(methodName) && subject == null)
{
     return null;
}
if(subject == null)
{
     log.warn("Real object of this proxy object doesn't exist, all 
method will return 'null': " + getIdentity());
     return null;
}
else
{
     return method.invoke(subject, args);
}

OR use your own IndirectionHandler implementation class e.g.
public class IndirectionHandlerCGLIBPatchedImpl extends 
IndirectionHandlerCGLIBImpl
{
...
}
and override the invoke-method in same way described above and declare 
it in OJB.properties file (IndirectionHandlerClass=...). But in this 
case you have use the reflection-API to get access to a private member 
"_realSubject" in AbstractIndirectionHandler.

regards,
Armin

> 
> I really would appreciate help,
> 
> Martin
> 
> 
> 
> ---------------------------------------------------------------------
>  To unsubscribe, e-mail: [email protected] For
> additional commands, e-mail: [email protected]
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.