2012-08-22 65 views
3

我想爲我的Play設置Janrain身份驗證!該項目在GAE上託管並使用GAE模塊。但我得到了下面的錯誤,而我嘗試登錄:Java Play框架解析JSON錯誤

RuntimeException occured : Cannot parse JSON (check logs) 

和播放highlighs以下行錯誤:

JsonElement rpxJson = rpxRequest.get().getJson(); 

這裏是方法,我使用的令牌回調:

public static void tokenCallback(String token) { 
    Properties p = Play.configuration; 
    // Try the driver 
    String rpxApi = p.getProperty("login.rpx.apiKey"); 


    WSRequest rpxRequest = WS.url("http://rpxnow.com/api/v2/auth_info"); 
    // get RPX 
    rpxRequest.setParameter("token", token); 
    rpxRequest.setParameter("apiKey", rpxApi); 

    JsonElement rpxJson = rpxRequest.get().getJson(); 
    JsonElement profile = rpxJson.getAsJsonObject().get("profile"); 
    String identifier = profile.getAsJsonObject().getAsJsonPrimitive("identifier").getAsString(); 

    welcome(identifier); 

} 

這裏是我從終端得到的錯誤:

Internal Server Error (500) for request POST /login/tokencallback 

Execution exception (In /app/controllers/Login.java around line 27) 
RuntimeException occured : Cannot parse JSON (check logs) 

play.exceptions.JavaExecutionException: Cannot parse JSON (check logs) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237) 
    at Invocation.HTTP Request(Play!) 
Caused by: java.lang.RuntimeException: Cannot parse JSON (check logs) 
    at play.libs.WS$HttpResponse.getJson(WS.java:668) 
    at controllers.Login.tokenCallback(Login.java:27) 
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 
    ... 1 more 
Caused by: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected EOF at line 2 column 1 
    at com.google.gson.JsonParser.parse(JsonParser.java:65) 
    at com.google.gson.JsonParser.parse(JsonParser.java:45) 
    at play.libs.WS$HttpResponse.getJson(WS.java:665) 
    ... 7 more 
Caused by: com.google.gson.stream.MalformedJsonException: Expected EOF at line 2 column 1 
    at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1310) 
    at com.google.gson.stream.JsonReader.peek(JsonReader.java:390) 
    at com.google.gson.JsonParser.parse(JsonParser.java:60) 
    ... 9 more 

我該怎麼辦?請幫我解決這個問題。

在此先感謝。

回答

2

好的,這是我的第一個建議。嘗試使用URL的HTTPS連接。我遇到了HTTP連接的一些問題。這裏是我如何做Janrain連接:

 WSRequest rpxRequest = WS.url("https://rpxnow.com/api/v2/auth_info"); 
     // get RPX 
     rpxRequest.setParameter("token", token); 
     rpxRequest.setParameter("apiKey", rpxApi); 

     HttpResponse res = null; 
     try { 
      res = rpxRequest.post(); 
     } catch (JavaExecutionException ex) { 
      Log.error("unknown error ", ex); 
      Validation.addError("", "Unknown Error: please try again"); 
      Validation.keep(); 
      Secure.login(); 
     } catch (Exception ex) { 
      Log.error("Most likely SSL error", ex); 
      Validation.addError("", "SSL Error: please try again"); 
      Validation.keep(); 
      Secure.login(); 
     } 
     if (res.getStatus() != 200) { 
      Log.error("status 200 error"); 
      Validation.addError("", "Status 200 error: please try again"); 
      Validation.keep(); 
      Secure.login(); 
     } 
     JsonElement rpxJson = res.getJson(); 
     JsonElement profile = rpxJson.getAsJsonObject().get("profile"); 
     JsonObject profileJson = profile.getAsJsonObject(); 
+0

非常感謝你。這是問題所在 – Jack

1

調用URL http://rpxnow.com/api/v2/auth_info後,它立即重定向到https://rpxnow.com/api/v2/auth_info(http s)。我懷疑你沒有得到JSON的答案,但在你的Web服務調用中有一個http重定向代碼。

兩個possibilites:

1)更改Web服務調用https://rpxnow.com/api/v2/auth_info,這可能解決您的問題,做不到這一點;

2)更改線路JsonElement rpxJson = rpxRequest.get().getJson();成類似

HttpResponse httpResponse = rpxRequest.get(); 
Logger.log (httpResponse.getString()); 
if (httpResponse.success()) { 
    JsonElement rpxJson = httpResponse.getJson(); 
} else { 
    // fail gracefully 
} 

,並報告上得到的第二行記錄答案的內容。

+0

非常感謝你!這是問題,但對不起,因爲我的聲譽,我無法爲你的答案+1。 – Jack

+0

我想現在你應該可以:) – Samuel

+0

是的,最後:) – Jack