grails / grails-cache

Grails Cache Plugin
https://plugins.grails.org/plugin/grails/cache
23 stars 39 forks source link

Fix: Ignore @Cacheable Annotation on Controller Methods #208

Open jsolas opened 3 months ago

jsolas commented 3 months ago

Related Issue: This PR addresses the issue described in https://github.com/grails/grails-cache/issues/168

Summary This PR addresses an issue where the @Cacheable annotation on controller methods does not behave as expected in plugin version 4.0.0. Instead of ignoring the annotation, the method is executed only the first time as if it were being cached, causing inconsistencies when the controller action receives parameters.

Solution To solve this issue, I have modified the buildDelegatingMethodCall method to check if the class is a controller and not a service. If it is a controller, the original method call is returned, effectively ignoring the @Cacheable annotation.

Here is the relevant code snippet:

@Override
protected Expression buildDelegatingMethodCall(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, MethodCallExpression originalMethodCallExpr, BlockStatement newMethodBody) {
    boolean isControllerClass = classNode.name.endsWith("Controller")
    boolean isServiceClass = classNode.name.endsWith("Service")

    if (isControllerClass && !isServiceClass) {
        return originalMethodCallExpr
    }

    // Existing logic for handling caching
}

Reason for Targeting the 4.x Branch I am submitting this change to the 4.x branch because I encountered this issue when migrating from Grails 2.5.6 to Grails 3.3.11, where I started using version 4 of the cache plugin.

CLAassistant commented 3 months ago

CLA assistant check
All committers have signed the CLA.