Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Grails的Faker给出变量未定义错误_Spring_Grails_Dependency Injection - Fatal编程技术网

Spring Grails的Faker给出变量未定义错误

Spring Grails的Faker给出变量未定义错误,spring,grails,dependency-injection,Spring,Grails,Dependency Injection,我有一个配置了SpringSecurityCore的Grails2.4.4应用程序。我想在引导中使用生成假用户。但是,当我在BootStrap中实例化bean fakerService并尝试使用它时,即。fakerService.firstname(),我得到一个错误: ERROR context.GrailsContextLoaderListener - Error initializing the application: Cannot invoke method firstName()

我有一个配置了SpringSecurityCore的Grails2.4.4应用程序。我想在引导中使用生成假用户。但是,当我在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的初学者。我做依赖注入错误吗

是的,你是:)

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

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

您添加了一个局部变量。局部变量没有发生任何特殊情况,Spring看不到它们,它们也不是依赖项注入的候选对象。将声明移动到类范围,在
init
闭包之前,例如

class BootStrap {

   def fakerService

   def init = {
      ...
   }
}

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

非常感谢,先生:)它成功了。不幸的是,我对java web世界完全陌生,不了解jack:P我只是在jvm中寻找一个快速的laravel替代方案,碰巧偶然发现了grails。考虑到java web的规模,如果您能向我推荐任何对java web入门至关重要的书籍或教程,我将非常高兴。servlets,spring,hibernate,xml文件让我很困惑….:P再次非常感谢;)是一本不错的第一本书,页面上还列出了其他一些书。请随意接受这一正确答案,顺便说一句:)