You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by "Julian Vassev (Created) (JIRA)" <ji...@apache.org> on 2011/11/19 21:28:51 UTC

[jira] [Created] (TAP5-1754) BeanModelSource cannot introspect CGLIB proxies and anonymous classes

BeanModelSource cannot introspect CGLIB proxies and anonymous classes
---------------------------------------------------------------------

                 Key: TAP5-1754
                 URL: https://issues.apache.org/jira/browse/TAP5-1754
             Project: Tapestry 5
          Issue Type: Bug
          Components: tapestry-core
    Affects Versions: 5.2.6
            Reporter: Julian Vassev
            Priority: Minor


When T5 is trying to create a BeanModel for displaying a row in a <t:grid> it examines the class of (maybe) the first element of the source list.
Sometimes I put CGLIB proxies or Anonymous classes in the source list.

When the class is anonymous, T5 complains about not being able to access  the generated class
java.lang.IllegalAccessError: tried to access class pkg.impl.FileSystemArchiveRepository$3$1 from class $PropertyConduit_133bd7cf475

When accessing a CGLIB proxy:
Render queue error in SetupRender[AddDomain:grid.columns]: Failure reading parameter 'model' of component AddDomain:grid: Exception generating conduit for expression 'exposeProxy': Class pkg.impl.DomainImpl does not contain a property (or public field) named 'exposeProxy'

I solved the problem by using T5 AOP (really great feature) but think it should be handled by Tapestry:

    @Match("BeanModelSource")
    public static void adviseAll(MethodAdviceReceiver receiver) {
        MethodAdvice advice = new MethodAdvice() {
            @Override
            public void advise(Invocation invocation) {
                if (invocation.getMethodName().startsWith("create")) {
                    Class<?> clazz = (Class<?>) invocation.getParameter(0);
                    if (clazz.isAnonymousClass()) {
                        invocation.override(0, findFirstNonAnonymousParent(clazz));
                    }
                    //spring aop
                    if (AopUtils.isCglibProxyClass(clazz)) {
                        invocation.override(0, (clazz.getSuperclass()));
                    }
                    invocation.proceed();
                }
            }
        };

        receiver.adviseAllMethods(advice);
    }

    public static Class<?> findFirstNonAnonymousParent(Class<?> clazz) {
        while (clazz.isAnonymousClass()) {
            clazz = clazz.getSuperclass();
        }

        return clazz;
    }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira