似乎无法找到关于此的信息,如果您有一些,请指向正确的主题/帖子/链接!
我有一个服务,让我们说它叫做'SomeServiceWithAReallyLongNameICannotChange'。当然,使用服务的正常方法是允许grails使用typless或typed表示法注入它们:
class SomeClass{
//...
def someServiceWithAReallyLongNameICannotChange
//...
}
- 或 -
class SomeClass{
//...
SomeServiceWithAReallyLongNameICannotChange someServiceWithAReallyLongNameICannotChange
//...
}
我想要做的是将服务重命名为更短的内容,但仅限于我正在使用它的地方,因为我无法更改实际服务的名称。我尝试使用'as'表示法,就像使用import一样,我尝试更改类型声明中的名称,但这些东西似乎都不起作用。这可能吗?
我试过这样的事情:
class SomeClass{
//...
def someServiceWithAReallyLongNameICannotChange as SS
//and I tried
def SomeServiceWithAReallyLongNameICannotChange SS
//no joy
//...
}
感谢您的帮助!
答案 0 :(得分:6)
解决方案是按类型使用autowire。默认情况下,grails按名称使用autowire,因此您必须使用与bean相同的名称声明该服务。
这是示例
class FooController {
boolean byName = false //set autowire by type
SomeReallyLongService service
}
解释here
更新: 甚至可以使用Autowired注释和限定符。
示例:
class MyController {
@Autowired
@Qualifier("myServiceWithDifferntName")
def someService
}
答案 1 :(得分:3)
您应该可以通过resources.groovy
beans = {
ss(SomeServiceWithAReallyLongNameICannotChange)
}
然后你可以正常注射它:
class SomeClass {
//...
def ss
//...
}
答案 2 :(得分:1)
另一种选择,如果你不想在整个控制器中按类型使用autowire,也不想出于某种原因添加自定义bean,那就是在你需要服务的控制器中添加一个简单的方法,像这样:
def someServiceWithAReallyLongNameICannotChange
def getSS() { someServiceWithAReallyLongNameICannotChange }
然后,您可以使用ss.someMethod()
在该控制器内的任何位置引用该服务。
但是,这仍然要求您为使用此服务的每个控制器添加一大块代码,否则您将对该服务进行不一致的命名。
(就我个人而言,我认为 doelleri 的方法是最好的,因为它允许你在不修改单个类的情况下在命名方面保持一致。)
答案 3 :(得分:0)
我尝试了它并且它在Grails 3上不适用于我,通过执行
来做到这一点import org.springframework.beans.factory.annotation.Autowired
...
@Autowired
PaymentStrategyService paymentStrategySvc