【问题标题】:Facing Exception of MessageBodyWriter while sending JSONObject to Rest web service将 JSONObject 发送到 Rest Web 服务时遇到 MessageBodyWriter 异常
【发布时间】:2017-01-05 09:43:21
【问题描述】:

我是网络服务的新手。由于要求,我必须通过 REST Web 服务向服务器发送一个文件[很可能是 txt 格式]。

我遇到了如下异常。

找不到媒体类型=application/json、类型=类 gvjava.org.json.JSONObject、genericType=类 gvjava.org.json.JSONObject 的 MessageBodyWriter。

这是我的网络服务方法。

@Path("{c}")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String convert(@PathParam("c") JSONObject object) throws JSONException {

    String result = "";     
    return "<ctofservice>" +  "<ctofoutput>" + result + "</ctofoutput>" + "</ctofservice>";
}

现在客户端代码如下所示

JSONObject data_file = new JSONObject();
        data_file.put("file_name", uploadFile.getName());
        data_file.put("description", "Something about my file....");
        data_file.put("file", uploadFile);       

        Client client = ClientBuilder.newClient();

        webTarget = client.target(uploadURL).path("ctofservice").path("convert");

          Response value = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
                .post(Entity.entity(data_file,MediaType.APPLICATION_JSON_TYPE),
                        Response.class);

请帮我解决这个问题。 提前致谢。

------------------------------------------ ----------------------------------------

正如 peeskillet 在下面的答案中所建议的,我尝试通过多部分发送文件。我仍然面临找不到八位字节流的异常。

下面是我的rest api

@Path("{c}")
@POST   
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response convert(@FormDataParam("file") FormDataContentDisposition file) {

    String result = ""; 
Some operation with attached parameter ...
    return Response.status(200).entity(result).build();
}

这是我的测试客户端

FormDataMultiPart  multiPart = new FormDataMultiPart();
        multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);

        FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
            uploadFile,MediaType.APPLICATION_OCTET_STREAM_TYPE);
        multiPart.bodyPart(fileDataBodyPart);

        Client client = Client.create();

        WebResource webResource = client
           .resource(uploadURL).path("ctofservice");

        ClientResponse response = webResource.accept("application/json")
                   .post(ClientResponse.class,multiPart);

        if (response.getStatus() != 200) {
           throw new RuntimeException("Failed : HTTP error code : "
            + response.getStatus());
        }

我在下面遇到异常

我不明白为什么需要以 MediaType.APPLICATION_OCTET_STREAM_TYPE 的形式发送数据?因为我之前使用 multipart 作为媒体类型...

感谢您的帮助..

【问题讨论】:

  • 如果你只是想上传一个文本文件,那么最好将文件作为二进制流(Multipart)发送。它将使您免于处理文本文件编码。

标签: jersey-client jersey-1.0


【解决方案1】:

无需配置任何其他内容,解决此问题的最简单方法是使用字符串而不是实际的 JSONObject(即仅传递 toString()

.post(Entity.json(data_file.toString()))

使用JSONObject 的问题在于没有提供者知道如何处理转换。您将在服务器端遇到同样的问题,因为没有提供程序来处理到JSONObject 的转换。所以你只需要这样做

@POST
public Response post(String json) {
    JSONObject jsonObject = new JSONObject(json);
}

如果您真的希望能够只使用JSONObject 而无需使用字符串,那么您应该查看this post

顺便说一句,这不是有效的 JSON(它是 XML)

"<ctofservice>" +  "<ctofoutput>" + result + "</ctofoutput>" + "</ctofservice>"

但你是说端点返回 JSON

【讨论】:

  • 我必须发送文件。如果我将其转换为字符串,则 url 字符串将太大。
  • 如果您要发送文件,那么为什么要使用 JSON?改用 MultiPart
  • 想法是,将文件的每一行复制到客户端的 List 中。然后将其传递给 Web 服务。我可以通过 MultiPart 实现吗?
  • 是的,您只需发送二进制文件。
  • 好的,让我试试。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多