gpt4 book ai didi

spring - Faker for Grails 给出变量未定义错误

转载 作者:行者123 更新时间:2023-12-02 14:23:22 24 4
gpt4 key购买 nike

我有一个配置了 spring-security-core 的 Grails 2.4.4 应用程序。我想使用 faker plugin 在 BootStrap 中生成假用户.但是,当我在 BootStrap 中实例化 bean fakerService 并尝试使用它时,即。 fakerService.firstname() ,我得到一个错误:

ERROR context.GrailsContextLoaderListener  - Error initializing the application: Cannot invoke method firstName() on null object
Message: Cannot invoke method firstName() on null object

我只是 Grails 的初学者。我做错了依赖注入(inject)吗?

http://pasteboard.co/rvbihRU.png

最佳答案

是的,你是 :)

一点背景。当您在没有显式范围修饰符(例如 public、private、protected)的 Groovy 类中添加类范围变量(字段)时,它默认为 public,就像类和方法一样。但它被认为是 JavaBean 意义上的属性,因此 Groovy 编译器会根据名称为您创建一个 getter 和一个 setter。因此,如果您声明 def fooString bar (你是否指定类型都没有关系)你会得到Object getFoo() , void setFoo(Object) , String getBar() , 和 void setBar(String)方法(您应该使用反编译器对 POGO 类进行反编译并自己查看 - 这是非常酷的东西 - 我推荐 JD-GUI ,但使用任何你喜欢的东西)。如果您已经声明了其中任何一个,Groovy 会跳过那个并且不会覆盖您的。这很酷,因为您可以将变量视为简单的公共(public)字段,但可以随时添加 getter 和/或 setter 逻辑,而不影响调用客户端(Groovy 或 Java,因为 Java 类一直在调用 getter 和 setter ,并且当您读取或写入属性时,Groovy 会为您调用 getter 和 setter)。

那我为什么要喋喋不休呢?依赖注入(inject)由 Spring 完成 - 您正在注入(inject) Spring bean。有多种方法可以做到这一点,但 Grails 中的默认设置是使用 autoinject-by-name。因此,对于在 ApplicationContext 中注册的任何 bean和特殊类(class),如 BootStrap , 集成测试等,Spring 会扫描寻找 setter 的方法。它去掉“set”并将下一个字母小写,这就是 setter 的“属性”名称。如果 ApplicationContext 中有一个具有该名称的 bean , Spring 将调用该 setter,传递具有该名称的 bean,如果类型同步,您的类将具有对该 bean 的引用。

您添加了一个局部变量。局部变量没有什么特别的事情发生,Spring 看不到它们,它们也不是依赖注入(inject)的候选者。将声明移动到类范围,在 init 之前关闭,例如

class BootStrap {

def fakerService

def init = {
...
}
}

Groovy 编译器会添加一个 getFakerService不太感兴趣的方法,但也是 setFakerService Spring 将看到的方法。它将确定其属性名称为“fakerService”,查看是否存在具有该名称的 bean,并调用 setter。这一切都发生在 Grails 调用 init 之前。关闭,因此此时该值将是非空 FakerService热切地等待您的来电。

关于spring - Faker for Grails 给出变量未定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28007701/

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