来自playframework 2.5.4中ws.url()的空指针异常

时间:2016-06-22 14:36:25

标签: java web-services playframework playframework-2.5

NullPointerException中的

ws.url()

WSRequest request = ws.url(url);

我正在使用play 2.5.4和Scala 2.11.7 测试URL被视为" http:// www。 google.com"
以下是测试的代码片段。

import javax.inject.Inject;
import play.mvc.*;
import play.libs.ws.*;
import java.util.concurrent.*;
import org.w3c.dom.Document;

public class WSApplication extends Controller {

    static String url = "http://www.google.com";
    @Inject 
    static WSClient ws;

    public static CompletionStage<Result> index(){
        WSRequest request = ws.url(url);
        CompletionStage<WSResponse>  wsResponse = request.get(); 
        return wsResponse.thenApplyAsync((r) -> ok(r.getBody()).as("text/html"));
    }
}

2 个答案:

答案 0 :(得分:1)

静态字段中的注入默认情况下无法在Play中工作,因为它是必须为activated for Guice的功能,这是默认的基础CDI实现。但这被认为是一种不好的做法。来自Guice文档:

  

静态成员不会在实例注入时注入。建议不要将此API用于一般用途,因为它遇到许多与静态工厂相同的问题:测试时笨拙,依赖性不透明,依赖于全局状态。

改为使用非静态成员:

@Inject
private WSClient ws;

附注:根据您的代码和静态方法签名判断,您已宣布使用Play的弃用静态路由生成器。您应该考虑迁移到play 2.4引入的默认注入路由生成器。有关说明,请参阅migration guide for Play 2.5

答案 1 :(得分:0)

在built.sbt

中添加依赖项注入后,此问题得以解决
routesGenerator := InjectedRoutesGenerator

和同样问题的scala版本

class MainController @Inject() (ws: WSAPI) extends Controller {
    val url = "http://www.google.com" 
    def index = Action.async {
      ws.url(url).get().map(r => Ok(r.body))
   }
}