未找到 Java 类型、net.sf.json.JSONObject 类和 MIME 媒体类型 application/json 的消息正文编写器

Posted

技术标签:

【中文标题】未找到 Java 类型、net.sf.json.JSONObject 类和 MIME 媒体类型 application/json 的消息正文编写器【英文标题】:A message body writer for Java type, class net.sf.json.JSONObject, and MIME media type, application/json, was not found 【发布时间】:2012-08-16 10:35:08 【问题描述】:

我正在使用 jersey 客户端调用 rest webservice。

我的网络服务正在使用 json,所以我需要将 json 用于调用我的网络服务提供商。

我正在按照以下方式进行操作。

    JSONObject object=new JSONObject();
    object.put("name", employee.getName());
    object.put("empId", employee.getEmpId());
    object.put("organizationName", employee.getOrganizationName());


ClientResponse response = service.path("rest").path("vtn").path("addEmplyee")
            .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, object);

但我得到以下异常:

09:52:01,625 错误 [[mvc-dispatcher]] Servlet.service() 用于 servlet mvc-dispatcher 抛出异常 com.sun.jersey.api.client.ClientHandlerException:Java 类型、net.sf.json.JSONObject 类和 MIME 媒体的消息体编写器 类型,application/json,未找到 在 com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:288) 在 com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204) 在 com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147) 在 com.sun.jersey.api.client.Client.handle(Client.java:648) 在 com.sun.jersey.api.client.WebResource.handle(WebResource.java:670) 在 com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) 在 com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563) 在 com.nec.jp.pflow.unc.service.EmployeeService.addEmployee(EmployeeService.java:44) 在 com.nec.jp.pflow.unc.controller.EmployeeController.addCustomer(EmployeeController.java:29) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

但如果我将我的 json 转换为字符串表示形式,例如:

String input = "\"name\" : \"" + employee.getName() + "\",\"empId\" : \"" + employee.getEmpId() + "\",\"organizationName\" : \"" + employee.getOrganizationName() + "\"";

ClientResponse response = service.path("rest").path("vtn").path("addEmplyee")
            .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, input);

然后它工作正常。

请建议我如何在不出现上述异常的情况下放置我的 JSON 对象。最好的方法是什么?

提前致谢。


我为上述问题找到了解决方案。现在我正在使用 jackson-mapper api 将 POJO 转换为 json。

下面是代码sn-p。

ObjectMapper mapper = new ObjectMapper();
ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
        .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, mapper.writeValueAsString(employee)); 

【问题讨论】:

如果您找到了解决方案,您可以将其发布为答案并自行选择。否则,这个问题看起来没有答案。 【参考方案1】:

只是复制上面问题的解决方案,以防万一有人在寻找答案。

使用 jackson-mapper api 将 POJO 转换为 json,如下面的代码 sn-p 所示:

ObjectMapper mapper = new ObjectMapper();
ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
        .type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, mapper.writeValueAsString(employee)); 

【讨论】:

最好避免在方法内转换为字符串。如果您正确配置了 clientconfig,最重要的是 objectMapper 实例也不需要。【参考方案2】:
JSONObject object=new JSONObject();

需要提供@XMLrootElementAnnotation....如果您是从远程访问Web服务....即XML Mapping..for Model类。

【讨论】:

【参考方案3】:

也可以使用 entity() 方法来实现,如下:

    ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
    .entity(employee, MediaType.APPLICATION_JSON_TYPE)
    .post(ClientResponse.class);

    ClientResponse response = resource.path("rest").path("vtn").path("addEmplyee")
    .type(MediaType.APPLICATION_JSON_TYPE)
    .entity(employee)
    .post(ClientResponse.class); 

【讨论】:

【参考方案4】:

添加 .toString() 对我有用:

JSONObject object=new JSONObject();
object.put("name", employee.getName());
object.put("empId", employee.getEmpId());
object.put("organizationName", employee.getOrganizationName());


ClientResponse response = service.path("rest").path("vtn").path("addEmplyee").type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class,object.toString());

【讨论】:

【参考方案5】:

我得到的错误有点不同,但最终解决方案对我有用

   Caused by: com.sun.jersey.api.client.ClientHandlerException: com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class com.siemens.spring.model.User, and MIME media type, application/json, was not found
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
    at com.sun.jersey.api.client.Client.handle(Client.java:648)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563)
    at com.siemens.controller.UserRegistration.process(UserRegistration.java:156)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)

这是对我有用的解决方案:

    Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:8080/NewsTickerServices/Siemens/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));//user is object of User Pojo class 

【讨论】:

【参考方案6】:

更好的方法是告诉jersey-client 它可以使用jackson 进行序列化: https://***.com/a/2580315/516188

粘贴设置:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);

JacksonJsonProviderjackson-jaxrs-json-provider 包中。

【讨论】:

【参考方案7】:

经过大量阅读,这是我得出的解决方案:

如果您使用的 JERSEY-CLIENT 如下指定的 1.9 或更高版本

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.9.1</version>
</dependency>

然后使用下面指定的 2.19 或更高版本的 MOXY Jar

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.19</version>
</dependency>

然后在Class of Client配置中添加MOXyJsonProvider.class如下图:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(MOXyJsonProvider.class);
Client client = Client.create(cc);

现在对客户端对象进行必要的配置以连接到服务器并执行请求:

WebResource webResource = client.resource(*restFulPath*);
Builder builder = webResource.accept(MediaType.APPLICATION_JSON);

builder.header("Content-Type", "application/json");
builder.header("Accept ", "application/json");
builder.accept(MediaType.APPLICATION_JSON);

try

    String requestData = "*requestInJson*";
    ClientResponse response = null;
    response = builder.post(ClientResponse.class, requestData);
    if (response.getStatus() == 200)
    
        MappedJsonReportOut res = response.getEntity(MappedJsonReportOut.class);
    

【讨论】:

以上是关于未找到 Java 类型、net.sf.json.JSONObject 类和 MIME 媒体类型 application/json 的消息正文编写器的主要内容,如果未能解决你的问题,请参考以下文章

未找到类型返回值的转换器:类 java.util.HashMap

未找到 Java 类型和 MIME 媒体类型 application/json;charset=utf-8 的消息正文阅读器

未找到 Java 类的消息正文编写器 ...和 ​​MIME 媒体类型 text/html [重复]

未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器

未找到 Java 类型、net.sf.json.JSONObject 类和 MIME 媒体类型 application/json 的消息正文编写器

Spring 问题:出现意外错误(类型=未找到,状态=404)