gpt4 book ai didi

grails - 为什么类名长度为一时,生成的 Controller 中没有注入(inject)服务?

转载 作者:行者123 更新时间:2023-12-02 15:40:45 25 4
gpt4 key购买 nike

在 Grails 4.0.3 和 Grails 3.3.11 中,如果您有一个名为 A 的域类,例如

package mypackage

abstract class A {
String name
// ...
// properties
// ...
}

然后将其填充到 Bootstrap.groovy ,例如
package mypackage

class BootStrap {

def init = { servletContext ->
A.withTransaction { status ->
A.saveAll(
new A( name: "a1" ),
new A( name: "a2" ),
new A( name: "a3" )
)
}
}
def destroy = {
}
}

如果您使用脚手架 ( create-scaffold-controller A),一切正常。

但是如果你删除脚手架 Controller 和 generate-all为您的类(class) A ,一切都失败了抛出 java.lang.NullPointerException因为 AService aService对象是 nullAController.groovy ,即服务对象未正确注入(inject) Controller 。

如果删除除域类文件 ( A.groovy ) 之外的所有生成文件,则将文件和类重命名为 A1 , 和 generate-all再次,一切正常!

您可以尝试使用任何单字母命名的类,例如 A , B , X等,并且生成的代码总是因为同样的原因而失败。在类名中添加另一个字符,重新生成,一切正常!

我想当一个类用单个字符命名时,某处肯定有一些名称冲突。

发表于 https://github.com/grails3-plugins/scaffolding/issues/44

最佳答案

Why are services not injected in generated controllers when the length of the class name is one?



这个问题与类名的长度关系不大,而更多地与类名以所有大写字母开头时如何生成 bean 名有关。如果您有一个名为 AService 的服务类, bean 名称将是 AService ,而不是 aService .这是因为如果工件类型(在本例中为 Service)之前的所有内容都是大写的,则 bean 名称也将以大写字母开头。一些相关测试在 https://github.com/grails/grails-core/blob/fcc975df7815bb62b392b6fb59efd2e4fcace279/grails-bootstrap/src/test/groovy/grails/util/GrailsNameUtilsTests.groovy#L92-L95 .

关于grails - 为什么类名长度为一时,生成的 Controller 中没有注入(inject)服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61710619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com