我正在编写一个Play Framework模块,以便在多个Play应用程序之间共享一些通用逻辑。我希望我的模块要做的事情之一是通过第三方模块提供一些常用功能,例如优秀的Markdown module。
首先,是否可以这样做?我希望包含我的模块的所有应用程序能够使用.markdown().raw()
String扩展,而无需将Markdown模块显式声明为依赖项。 Play Framework Cookbook第5章似乎暗示它是可能的,除非我读错了。
其次,如果有可能,它是如何运作的?我创建了以下vanilla示例案例,但我仍然遇到错误。
我在同一个父目录中创建了一个新的空应用程序“myapp”和一个新的空模块“mymod”。然后我将mymod/conf/dependencies.yml
修改为:
self: mymod -> mymod 0.1
require:
- play
- play -> markdown [1.5,)
我在mymod上运行play deps
并成功下载并安装了Markdown模块。正常运行play build-module
也没有错误。
然后,我将myapp/conf/dependencies.yml
修改为:
# Application dependencies
require:
- play
- mymod -> mymod 0.1
repositories:
- Local Modules:
type: local
artifact: ${application.path}/../[module]
contains:
- mymod
我在myapp上运行play deps
并成功找到了mymod,并生成了myapp/modules/mymod
文件,其中包含mymod的绝对路径。
我使用play run
运行了myapp,并且能够在http://localhost:9000/上看到欢迎页面。到目前为止一切都很好。
接下来,我将myapp/app/views/Application/index.html
修改为:
#{extends 'main.html' /}
#{set title:'Home' /}
${"This is _MarkDown_, by [John Gruber](http://daringfireball.net/projects/markdown/).".markdown().raw()}
我重新启动了myapp,现在我收到以下错误。
09:03:23,425 ERROR ~
@6a6eppo46
Internal Server Error (500) for request GET /
Template execution error (In /app/views/Application/index.html around line 4)
Execution error occured in template /app/views/Application/index.html. Exception raised was MissingMethodException : No signature of method: java.lang.String.markdown() is applicable for argument types: () values: [].
play.exceptions.TemplateExecutionException: No signature of method: java.lang.String.markdown() is applicable for argument types: () values: []
at play.templates.BaseTemplate.throwException(BaseTemplate.java:86)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:257)
at play.templates.Template.render(Template.java:26)
at play.templates.GroovyTemplate.render(GroovyTemplate.java:187)
at play.mvc.results.RenderTemplate.<init>(RenderTemplate.java:24)
at play.mvc.Controller.renderTemplate(Controller.java:660)
at play.mvc.Controller.renderTemplate(Controller.java:640)
at play.mvc.Controller.render(Controller.java:695)
at controllers.Application.index(Application.java:13)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
at Invocation.HTTP Request(Play!)
Caused by: groovy.lang.MissingMethodException: No signature of method: java.lang.String.markdown() is applicable for argument types: () values: []
at /app/views/Application/index.html.(line:4)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:232)
... 13 more
为了确认我没有疯狂,我尝试将play -> markdown [1.5,)
行添加到myapp/conf/dependencies.yml
并重新启动应用,并确认其有效。
我觉得我错过了一些明显的东西。非常感谢任何可以提供帮助的人! :)
答案 0 :(得分:0)
是的,我有同样的问题,似乎通过自定义自制模块的传递依赖性不起作用