这似乎违反了"惯例" Grails的本质。如果我没有用我的视图显式调用render()
方法,那么我的Interceptor中的服务注入为空。
拦截器:
class GlobalParamsInterceptor {
def SysConfigService sysConfigService;
GlobalParamsInterceptor() {
matchAll();
}
boolean before() {
true
}
boolean after() {
model.isApplicationOpen = sysConfigService.isApplicationOpen();
true
}
void afterView() {
// no-op
}
}
控制器:
class ConfigController {
static namespace = "coordinator";
def index() {
render(view: "index");
}
}
如果我在控制器中注释render(view: "index")
,那么我的拦截器中的sysConfigService
为null
,否则效果很好。有人可以解释一下为什么会这样吗?
编辑: Grails 3.1.3
编辑#2
看来我错了,sysConfigService
不为空...它的模型为null,所以我无法在其上设置isApplicationOpen
属性。尽管如此,我不相信我应该调用render()
方法来访问模型,因为我认为这是来自框架的继承属性。
答案 0 :(得分:1)
如果我在我的控制器中注释掉渲染(视图:"索引") 我的Interceptor中的sysConfigService为null,否则效果很好。
我不认为这是可能的。在您的拦截器中的依赖注入发生并在任何请求进入应用程序之前完成。在控制器操作中调用render
(或其他任何内容)不会影响该操作。
此外,您还有def SysConfigService sysConfigService
。 def
是多余的。您可以删除它,编译器将生成相同的代码。如果您删除def
,则SysConfigService
才有意义。
编辑:
我在发帖后意识到我没有在标题中提到这个问题:
使用拦截器时是否需要render()?
答案是" no"。
在你的例子中,你的控制器调用渲染。我的 问题是,如果我不调用渲染并依赖于"惯例"的 Grails自动检测我的" index.gsp"相反,那就是我的模特 拦截器是NULL。
请参阅https://github.com/jeffbrown/raymond/commit/f354047158038f571630ab7e3e0416850bdde8a8处的提交。
当我向/demo/report
发送请求时,我在stdout上看到以下输出:
Model: [name:Raymond]