如何在Java响应对象中返回JsonArray



我试图实现基于java的web服务服务器返回到Json和基于java脚本的web服务客户端。下面是我的java部分:

@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-services,我有一些困难来调试我的代码。

编辑

顺便说一下,当我尝试第一个版本的gerecommendations()函数(带循环)

时,我也得到了另一个错误
     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.

但是正如我所说的,当我删除循环并将第二段代码剪切到gerecommendations()函数中时,这两个错误都消失了,我在我的网站上得到了响应。

EDIT2

当我用下面的语句改变gerecommendations()函数的循环和返回语句时,我再次get出现相同的错误

 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及以下的构建语句,在我的gerecommendations()函数中甚至没有运行。所以,我认为我的问题我怎么能给这个对象访问控制允许起源权限?

如果可以使用第三方库,在这种情况下使用Google的Gson可能是一个有效的解决方案。在将Models转换为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>

你应该尝试最简单的方法:

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

最新更新