使用grails bean定义将Closure传递给spring bean

时间:2017-10-26 19:03:38

标签: spring grails groovy javabeans spring-bean

是否可以使用包含Closure的bean定义?有时候,我想要一个类几乎相同的实例,但是在一些小的行为上有区别 - 比数据更多,所以只是在我的bean定义中传递不同的字段是不够的。

示例所需的bean定义:

beans {
    myCustomWidget1(Widget) {
        myClosure = { w -> return w.doThis() }
    }

    myCustomWidget2(Widget) {
        myClosure = { w -> return w.doThat() }
    }
}

示例课程:

class Widget {
    Closure myClosure

    ...
}

问题是Anonymous (Inner) Beans已经使用了闭包语法,并且在应用程序启动时会评估这些匿名bean,而不是设置类的Closure字段。这显然会在运行时导致异常。

我已经克服了以前创建的小助手类,我将其注入到我的bean中,行为更改被写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的“时髦”方式。

我们正在使用Grails 2.4.2,但我相信BeanBuilder会将我想要的Closure视为匿名bean,无论grails / groovy版本如何。

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是代替......

beans {
    myCustomWidget1(Widget) { bean ->
        bean.setPropertyValue 'myClosure', { w -> return w.doThis() }
    }

    myCustomWidget2(Widget) { bean ->
        bean.setPropertyValue 'myClosure', { w -> return w.doThat() }
    }
}

试试这个......

def listDevices(username, pass, regex):
    command = "list-dev " + regex
    deviceArray = []
    connectString = "plink -ssh -l " + username + " -pw " + pass + " -P " + SshPort + " " + Server + " \"" + command + "\""
    rawList = subprocess.check_output(connectString, shell=True)
          for line in rawList.split("\r\n"):
              if "" is not line:
                  deviceArray.append(line)
          print deviceArray
          return deviceArray

Server = 10.10.10.1
SshPort = 22 
username = "test"
pass - "password"  
regex = "rt*mdr*"    

mdrList = listDevices(username, pass, regex)
print mdrList