Mauro Molinari created GROOVY-10757:
---------------------------------------

             Summary: Regression from 2.5.16+: ClassCastException at runtime
                 Key: GROOVY-10757
                 URL: https://issues.apache.org/jira/browse/GROOVY-10757
             Project: Groovy
          Issue Type: Bug
          Components: Compiler
    Affects Versions: 2.5.18, 2.5.17, 2.5.16
            Reporter: Mauro Molinari


I've found a very nasty bug in Groovy 2.5.16+.

It's really hard to extract a simple test case, so I'll try to explain what is 
going on as much as possible.

I have a {{@CompileStatic}} Groovy class hierarchy. Compilation succeeds, but a 
{{ClassCastException}} happens at runtime. The hierarchy is like this:

{code:groovy}
@Named
@CompileStatic
@Scope('session')
abstract class GenericServicePurchaseBean<T extends GenericServicePurchaseDao> 
implements Serializable {
    T dao

    void setDao(final T dao) {
        this.dao = dao
    }

    protected abstract List<? extends ProductIdto> retrieveAvailableProducts()

        @CompileDynamic // see note below
        void resetState() {
                // ...
                retrieveAvailableProducts()
                // ...
        }
}
{code}
 
{code:groovy}
@Named
@CompileStatic
@Scope('session')
class FooPurchaseBean extends GenericServicePurchaseBean<FooPurchaseDao> {
        @Inject
        @Named('fooPurchaseDao')
        @Override
        void setDao(final FooPurchaseDao dao) {
                super.setDao(dao)
        }

        @Override
        protected List<? extends ProductIdto> retrieveAvailableProducts() {
                dao.loadAllAvailableProductsForNewPurchase(customer)
        }

        @Override
        void resetState() {
                super.resetState();
                // ...
        }
}
{code}

The error I get at runtime is this:

{noformat}
Caused by: java.lang.ClassCastException: class 
it.dcssrl.shop.web.purchase.view.dao.FooPurchaseDao$$EnhancerBySpringCGLIB$$271ceca2
 cannot be cast to class it.dcssrl.shop.web.purchase.view.dao.BarPurchaseDao 
(it.dcssrl.shop.web.purchase.view.dao.FooPurchaseDao$$EnhancerBySpringCGLIB$$271ceca2
 and it.dcssrl.shop.web.purchase.view.dao.BarPurchaseDao are in unnamed module 
of loader org.apache.catalina.loader.ParallelWebappClassLoader @5a075a)
        at 
it.dcssrl.shop.web.purchase.view.FooPurchaseBean.retrieveAvailableProducts(FooPurchaseBean.groovy:217)
        at 
org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)
        at 
it.dcssrl.shop.web.purchase.view.GenericServicePurchaseBean.resetState(GenericServicePurchaseBean.groovy:682)
        at 
it.dcssrl.shop.web.purchase.view.FooPurchaseBean.resetState(FooPurchaseBean.groovy:148)
 [...]
{noformat}

If I remove the Groovy compiler optimization to enable Indy compilation, the 
error happens all the same, but the stack trace does not have the line about 
{{org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234)}}.

Please note that:
- this problem does not happen with Groovy 2.5.15
- it happens with Groovy 2.5.16, 2.5.17 and 2.5.18
- it DOES NOT happen if compiling/running the application within Eclipse/WTP 
and Groovy Eclipse plugin
- the {{resetState()}} method above in the base class is marked with 
{{@CompileDynamic}} because of another nasty problem I was not able to isolate, 
which otherwise produces another {{ClassCastException}} at runtime, although 
completely different from this one; this has been happening from 2.5.13 at 
least (it was not occurring with 2.5.9)

Any idea of what is going on? And of a possible not-too-dirty workaround (apart 
from downgrading to Groovy 2.5.15)?



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to