使用 PlayFramework 2.4.2 的 ProvisionException
Posted
技术标签:
【中文标题】使用 PlayFramework 2.4.2 的 ProvisionException【英文标题】:ProvisionException using PlayFramework 2.4.2 【发布时间】:2015-07-24 12:48:05 【问题描述】:我正在将一个项目从 Play 2.2.4 迁移到 2.4.2,我遇到了一个我无法理解和解决的异常。
Unexpected exception
ProvisionException: Unable to provision, see the following errors:
1) Error injecting constructor, java.lang.NullPointerException
at controllers.Application.<init>(Application.java:33)
while locating controllers.Application
for parameter 1 at router.Routes.<init>(Routes.scala:36)
while locating router.Routes
while locating play.api.inject.RoutesProvider
while locating play.api.routing.Router
1 error
这是因为我为 WS API 添加了依赖注入,例如:
public class Application extends Controller
@Inject
WSClient ws;
WSRequest request = ws.url("https://...");
...
build.sbt
文件包含必要的配置
libraryDependencies ++= Seq(
javaJdbc,
cache,
javaWs
)
// Play provides two styles of routers, one expects its actions to be injected, the
// other, legacy style, accesses its actions statically.
routesGenerator := InjectedRoutesGenerator
可能缺少什么或做错了什么?
【问题讨论】:
【参考方案1】:这一行导致 Nullpointer:
当 Guice 实例化 Application
类时,ws.url("https://...");
ws 为空。此外,将request
作为控制器字段不是线程安全的。将您的代码更改为以下内容:
public class Application extends Controller
private WSClient ws;
@Inject
public Application(WSClient ws)
this.ws = ws;
WSRequest request = this.ws.url("https://...");
...
【讨论】:
谢谢,解决了我的问题!我想知道如果它不起作用,为什么 Play 文档将其声明如下:playframework.com/documentation/2.4.x/JavaWSWSRequest request = ws.url("http://example.com");
这一行应该属于控制器方法。以上是关于使用 PlayFramework 2.4.2 的 ProvisionException的主要内容,如果未能解决你的问题,请参考以下文章
如何在 playframework 中使用 guice 使用提供程序进行依赖注入
如何使用 JPA 在 playframework 1.2.4 中执行存储过程?
playframework:如何在 html 模板中使用常量类?
playframework,需要一个好的创建、更新、删除示例使用相同的 html 页面