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"));
}
}
答案 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))
}
}