【问题标题】:Private static field not accessible from a nested closure嵌套闭包无法访问私有静态字段
【发布时间】:2019-07-22 12:30:32
【问题描述】:

假设我有以下课程:

@Slf4j
class MySuperclass {

    public void testMethod() {
        def test = [1, 2, 3]
        test.each {it ->
            log.info("gab" + it)
            def test2 = [4,5,6]
            test2.each {
                log.info("" + it)
            }
        }
    }
}

然后:

class MySubclass extends MySuperclass {

    public void process() {
        testMethod()
    }
}

当我调用mySubclass.process() 时,我得到一个错误:

No such property log for class: com.ingenuity.app.kang.batch.MySubclass

该错误仅针对 test2 闭包内的行引发。如果我声明一个公共日志字段,它工作正常。如果我在子类中添加@Slf4j 注释,它也可以正常工作。

我不明白这里发生了什么。这是一个时髦的错误吗? 我发现这个问题可能是相关的,但它不是相同的行为: Groovy closure not work with static final field from super class

【问题讨论】:

标签: grails groovy slf4j


【解决方案1】:

处理它的一种方法是将日志属性作为类的静态成员引用。 https://github.com/jeffbrown/logissue 的项目证明了这一点。

https://github.com/jeffbrown/logissue/blob/d089c296c102980855a88061275e52485965e4ab/src/main/groovy/logdemo/MySuperclass.groovy

package logdemo

import groovy.util.logging.Slf4j

@Slf4j
class MySuperclass {

    void testMethod() {
        def test = [1, 2, 3]
        test.each {it ->
            log.info("gab" + it)
            def test2 = [4,5,6]
            test2.each {
                MySuperclass.log.info("" + it)
            }
        }
    }
}

这行得通。

~ $ git clone git@github.com:jeffbrown/logissue.git
Cloning into 'logissue'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 22 (delta 0), reused 22 (delta 0), pack-reused 0
Receiving objects: 100% (22/22), 53.62 KiB | 1.28 MiB/s, done.
~ $ cd logissue/
  $ ./gradlew run

> Task :run
16:41:19.022 [main] INFO  logdemo.MySuperclass - gab1
16:41:19.027 [main] INFO  logdemo.MySuperclass - 4
16:41:19.027 [main] INFO  logdemo.MySuperclass - 5
16:41:19.027 [main] INFO  logdemo.MySuperclass - 6
16:41:19.027 [main] INFO  logdemo.MySuperclass - gab2
16:41:19.027 [main] INFO  logdemo.MySuperclass - 4
16:41:19.027 [main] INFO  logdemo.MySuperclass - 5
16:41:19.027 [main] INFO  logdemo.MySuperclass - 6
16:41:19.027 [main] INFO  logdemo.MySuperclass - gab3
16:41:19.027 [main] INFO  logdemo.MySuperclass - 4
16:41:19.027 [main] INFO  logdemo.MySuperclass - 5
16:41:19.027 [main] INFO  logdemo.MySuperclass - 6

BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed

【讨论】:

  • 谢谢杰夫。是的,正如问题中所述,我找到了解决方法。我只是想知道这是一个错误还是我做错了什么。
  • 我认为是。您描述的行为与issues.apache.org/jira/browse/GROOVY-5776 相关(可能不完全相同)。
  • 谢谢,我没看到那个。我会接受答案。
【解决方案2】:

你需要在 MySuperClass 中添加日志依赖,比如:

import groovy.util.logging.Slf4j

@Grapes([
    @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.13') 
])

@Slf4j
class MySuperclass {
...
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多