Grails 无法从嵌套闭包访问私有静态字段
假设我有以下课程:Grails 无法从嵌套闭包访问私有静态字段,grails,groovy,slf4j,Grails,Groovy,Slf4j,假设我有以下课程: @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)
@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 bug吗?
我发现这个问题可能与此相关,但它不是相同的行为:
您需要在MySuperClass中添加日志依赖项,如:
import groovy.util.logging.Slf4j
@Grapes([
@Grab(group='ch.qos.logback', module='logback-classic', version='1.0.13')
])
@Slf4j
class MySuperclass {
...
}
处理它的一种方法是将log属性作为类上的静态成员引用。位于的项目证明了这一点 这很有效
~ $ 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
我想这个链接可能会给你们一些解决问题的想法。我不认为这是问题所在。这就像在
logback中一样,日志记录工作需要依赖关系,但和不能从嵌套闭包访问私有静态成员无关。谢谢Jeff。是的,如问题中所述,我找到了解决办法。我只是想知道这是一个bug还是我做错了什么。我想是的。你所描述的行为与之相关(可能不完全相同)。谢谢,我没有看到。我会接受答案的。
~ $ 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