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]
>
>