Hi Stephen,

that CGLIB stuff is a bit tricky. Maybe I can give soem informations that can help you to find a solution.

If you create a CGLIB-Proxy for class A, the proxy will behave as being of a class that extends A and may also implement some additional interfaces. There for if 'proxy is the CGLIB-Proxy of class A you get:

assertTrue(proxy instanceof A);
assertTrue(proxy.getClass() != A.class);
assertTrue(proxy.getClass().getName().equals("A$$ProxiedByCGLIB"));
// (not sure on the extension of A but it includs '$$' and 'CGLIB')
assertTrue(proxy.getClass().getSuperClass() == A.class);

Depending on the construction of the proxy, the following may also be valid:

assertTrue(proxy instanceof AnAdditionalInterface);
assertFalse(new A() instanceof AnAdditionalInterface);

The proxy itself behaves similar to java.lang.reflect.InvocationHandler. Each method call is passed to an invoce method where the implementer of the proxy can define the behaviour of the proxy. In most cases the proxy will add some additional functionality to the original class. At hibernate I expect that on every invocation of a method of A, the proxy will load the required object and call the same method on it. For internal use I also expect hibernate to implement an interface that offers additional methods.

The problem that Paul has, and others had before, is that Castor calls getClass().getName() on every object it have to marshal. As this call does not return the name of the original calls but the one of the proxy (e.g. A$$ProxiedByCGLIB) Castor is not able to find the right mapping and uses intorspection instead. Introspection also finds the hidden interface methods and tries to marshal their result.

The only 2 solution I can see are:

1. test for the hidden interfaces with instanceof. as this would require us to rever to a class of hibernate I'll refuse that.

2. test if getClass().getName() includes 'CGLIB'. if that's true call getClass().getSuperClass().getName() instead and use this one to search for a mapping.

Just my 0,02 cent or maybe a bit more ;-)

Regards
Ralf



Stephen Bash schrieb:
Paul-

I've been pondering your problem on and off most of the day.  Recently
someone else had a different problem also related to the CGLIB
proxies, so there may be some merit in looking into them.

Just to make sure I understand the problem, the proxy classes have
extra get methods that return objects you don't want to marshal?  And
since Castor validates the mapping file against the real classes, not
the proxy classes, marking the "field" as transient causes a
MappingException?

I'll try to think about it a little and see if we can find a simple solution.

Stephen


On 3/2/06, Paul Grillo <[EMAIL PROTECTED]> wrote:

I have a nasty problem.  Been using Castor for a couple of years for all our
classes.  Basically we have a large set of mapping files that generally use
auto-complete="true" and we specify what is transient.

We are now implementing Hibernate to perist.  However, when we load up an
object from the DB and then go to marshal it we see the following problem.

Hibernate uses CGLIB and proxies for the class.  At run time there is a
"getxxxx" that returns an object that we definately do not want to marshal.

So, i can'd set it transient because Castor complains that it cannot find it
in the unproxied/mapped class.

It will be a large problem for us to crawl through all our mapping files and
specify each attribute for mapping.  Is there a way around this?

Are there any hooks in Castor where i can indicate to it to not marshal a
particular attribute?  Any code i can inject any where to handle this?

thanks.

oh,  the decision to use Hibernate has been made.  Not sure i can switch to
anything else at this point.



-------------------------------------------------
If you wish to unsubscribe from this list, please send an empty message to the following address:

[EMAIL PROTECTED]
-------------------------------------------------

Reply via email to