Play Framework 2.4集成外部PDF路由配置编译报错求助
解决Play Framework 2.4路由歧义导致的编译错误问题
你遇到的核心问题是两个Assets.at路由的定义产生了方法歧义——Play框架生成反向路由时,因为两个路由都绑定到了controllers.Assets.at且固定了path参数,导致编译器无法区分模板中的调用对应哪一个路由,最终抛出参数不足的错误。
问题根源拆解
你定义的两个路由:
GET /assets/plan/*file controllers.Assets.at(path="/home/entwickl", file) GET /assets/*file controllers.Assets.at(path="/public", file)
都固定了path参数,Play会为它们生成同名的反向路由方法Assets.at(file: String)。当模板中调用routes.Assets.at("xxx")时,编译器看到两个完全一样的方法签名,无法判断该绑定哪个路由,因此报错。
解决方案:给路由指定唯一别名
给其中一个路由(比如外部PDF的路由)设置独特的方法别名,让反向路由生成不同的方法名,消除歧义:
1. 修改routes文件
// 外部PDF资源路由:指定别名为planAssets GET /assets/plan/*file controllers.Assets.at(path="/home/entwickl", file) as planAssets // 原有公共资源路由:保持默认方法名即可 GET /assets/*file controllers.Assets.at(path="/public", file)
2. 更新模板中的调用
- PDF链接调用新的别名方法:
@if(sf.equalsIgnoreCase("S")) { <a href="@routes.Assets.planAssets("PO_675245.pdf")">LINK</a> } else { @sf }
- 原有JS调用保持不变(因为它对应第二个路由的默认方法名):
<script src="@routes.Assets.at("javascripts/login.js")"></script>
额外:修正未托管资源目录配置
你当前的build.sbt配置有路径拼接问题:
unmanagedResourceDirectories in Assets += baseDirectory.value "/home/entwickl"
baseDirectory.value是项目根目录,直接拼接绝对路径会生成错误的路径(比如/你的项目根目录/home/entwickl)。如果要指向系统级的/home/entwickl,应该改成:
unmanagedResourceDirectories in Assets += file("/home/entwickl")
这样Play才能正确识别这个外部目录作为资源目录。
内容的提问来源于stack exchange,提问作者Twistleton
相关产品推荐
相关产品推荐

