2015-08-15 30 views
3

我試圖實現基於java的web服務服務器,該服務器返回到基於Json和Java腳本的Web服務客戶端。這裏是我的Java部分:如何在Java響應對象中返回JsonArray

@Path("/myapp") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class MyRecommender { 
      @POST 
      @Path("/recs") 
      public Response getRecommendations() { 
       //Assume recommendation List contains some Recommendation objects 
       //I removed it for simplicity.    
       List<Recommendation> recommendation; 
       JsonArrayBuilder builder = Json.createArrayBuilder(); 
       for (Recommendation rec : recommendations) { 
        builder.add(Json.createObjectBuilder().add("firstPersonName", "\"" + rec.getFirstPerson().getName() + "\"") 
          .add("firsPersonURL", "\"" + rec.getFirstPerson().getURL() + "\"") 
          .add("secondPersonName", "\"" + rec.getSecondPerson().getName() + "\"") 
          .add("secondPersonURL", "\"" + rec.getSecondPerson().getURL() + "\"") 
          .add("score", "\"" + rec.getSimilarity() + "\"")); 
       } 
       JsonArray jsonData = builder.build(); 
       return Response.ok(jsonData, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*") 
         .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build(); 
      } 
     } 
} 

現在,當我調用此函數從我的js的客戶,我得到:

POST http://localhost:8080/myapp/recs 500 (Request failed.) 

但是,當我更換for循環,並與下面的代碼返回剪斷我正確地在我的js中得到了迴應。

變更部分:

// remove for loop and change jsonData type. 
    String jsonData = "{\"name\":\"John\"}"; 
    return Response.ok(jsonData, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build(); 

所以,我想可能是什麼問題呢?自從我第一次使用Web服務以來,我有一些困難來調試我的代碼。

編輯

順便說一句,我還得到另一個錯誤,當我嘗試getRecommendations的第一個版本()函數(帶環)

 XMLHttpRequest cannot load http://localhost:8080/myapp/recs. 
    No 'Access-Control-Allow-Origin' header is present on the requested resource. 
    Origin 'http://localhost:3000' is therefore not allowed access. 
The response had HTTP status code 500. 

但正如我所說,當我刪除循環並將第二個代碼剪切到getRecommendations()函數中,這兩個錯誤都消失了,我在我的網站上得到響應。

EDIT2

當我改變了迴路上與再次返回下面我getRecommendations的聲明()函數得到同樣的錯誤

JsonObject value = Json.createObjectBuilder() 
       .add("name", "John").build(); 
return Response.ok(value, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build(); 

編輯3

據我所知,createObjectBuilder().build()JsonArrayBuilder.build()返回一個JSON object及以下的這個構建語句在我的getRecommendations()函數中甚至沒有運行。所以,我認爲我的問題我怎麼能給這個對象授予Access-Control-Allow-Origin權限?

+0

HTTP 500是內部服務器錯誤。你是否檢查服務器是否連接並正常工作? – Dipu

+0

@SudiptoChandra是的,正如我所說的,如果我將getRecommendations()函數的循環和返回語句替換爲第二個代碼,它將正常工作。所以我不認爲可能有任何連接問題。 – zwlayer

+1

恕我直言'getRecommendations()'應該註解'@ GET' – PeterMmm

回答

1

你應該儘量簡單的方法:

return Response.ok().entity(recommendation).header("Access-Control-Allow-Origin", "*") 
        .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build(); 
+0

當我嘗試你的解決方案時,我也得到同樣的錯誤 – zwlayer

+0

你確定'推薦!= null'嗎?無論如何你可以包裝方法體在內部try {} catch()並打印stacktrace。 – sibnick

+0

我確定,因爲我還將推薦內容打印到控制檯中(爲了簡單起見,我在問題中刪除了它) TY) – zwlayer

2

如果確定使用第三方庫,使用谷歌的GSON可能是在這種情況下有效的解決方案。將模型轉換爲JSON時非常方便。 你可以做的是這樣的。

ArrayList<Recommendation> recommendationList = new ArrayList<Recommendation>();
Gson gson = new Gson(); String jsonData = gson.toJson(reccomendationList);

要使用它,在你的POM文件的依賴,你可以做到這一點。

<dependency> 
    <groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
    <version>2.3.1</version> 
    <scope>compile</scope> 
</dependency>