使用 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/JavaWS WSRequest request = ws.url("http://example.com"); 这一行应该属于控制器方法。

以上是关于使用 PlayFramework 2.4.2 的 ProvisionException的主要内容,如果未能解决你的问题,请参考以下文章

如何在 playframework 中使用 guice 使用提供程序进行依赖注入

如何使用 JPA 在 playframework 1.2.4 中执行存储过程?

playframework:如何在 html 模板中使用常量类?

playframework,需要一个好的创建、更新、删除示例使用相同的 html 页面

如何跟踪 Playframework 调用的所有 HTTP 请求?

playframework - 多对多,使用 crud 模块有额外的列