问题 Play控制器如何将具有正确名称的变量注入到模板中?


在里面 播放入门文档,他们展示了这个控制器:

public static void index() {
  Post frontPost = Post.find("order by postedAt desc").first();
  List<Post> olderPosts = Post.find("order by postedAt desc").from(1).fetch(10);
  render(frontPost, olderPosts);
}

然后,在模板中使用frontPost和olderPosts而没有任何特殊的映射!

<a href="#">${frontPost.title}</a>

Play怎么保留这些名字?


3811
2017-10-27 19:25


起源



答案:


它是通过代码注入完成的。

在编译时,一些类被增强(使用代码注入,通过 了Javassist),以便添加一些信息,例如变量名。

在render方法中,此操作由“play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer”类完成。


15
2017-10-27 19:48



传递没有要渲染名称的对象时,此功能会中断(例如:render(Posts.findById(id)))。生成的错误消息是模板中的简单NullPointerException。您是否知道在这种情况下错误消息无法提供更多帮助的充分理由? - pawstrong


答案:


它是通过代码注入完成的。

在编译时,一些类被增强(使用代码注入,通过 了Javassist),以便添加一些信息,例如变量名。

在render方法中,此操作由“play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer”类完成。


15
2017-10-27 19:48



传递没有要渲染名称的对象时,此功能会中断(例如:render(Posts.findById(id)))。生成的错误消息是模板中的简单NullPointerException。您是否知道在这种情况下错误消息无法提供更多帮助的充分理由? - pawstrong