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

时间:2012-08-21 05:17:41

标签: json rest jersey

我正在使用泽西客户端拨打休息网络服务。

我的web服务正在使用json,所以我需要让json调用我的webservice提供者。

我是以下面的方式做的。

    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 ERROR [[mvc-dispatcher]] Servlet.service()for servlet   mvc-dispatcher抛出异常    com.sun.jersey.api.client.ClientHandlerException:Java类型的消息正文编写器,类net.sf.json.JSONObject和MIME媒体   类型,application / json,未找到           at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:288)           at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204)           at 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)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)           at 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。

以下是代码段。

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

7 个答案:

答案 0 :(得分:12)

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

粘贴设置:

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

JacksonJsonProvider位于jackson-jaxrs-json-provider包中。

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

添加.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());

答案 3 :(得分:1)

JSONObject object=new JSONObject();

如果要从远程访问Web服务,则需要提供@XMLrootElement Annotation ....即XML Mapping..for Model类。

答案 4 :(得分:1)

经过大量阅读后,我得到了解决方案:

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

<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>

然后在Client of Client配置中添加MOXyJsonProvider.class,如下所示:

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

现在对Client Object进行必要的配置以连接到服务器并执行请求:

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);
    }
}

答案 5 :(得分:0)

您还可以使用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); 

答案 6 :(得分:0)

错误哪一点有点不同但最后解决方案对我有用

   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