2012-08-21 6 views
9

Я использую джерси-клиент для совершения звонка на отдых в webservice.Писатель тела сообщения для типа Java, класс net.sf.json.JSONObject и тип носителя MIME, application/json, не был найден

Мой веб-сервис потребляет 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: 01625 ERROR [[MVC-диспетчерская]] Servlet.service() для сервлета Mvc-диспетчеру бросил исключение ком .sun.jersey.api.client.ClientHandlerException: писатель тела сообщения для типа Java, класс net.sf.json.JSONObject и MIME media тип, приложение/json, не найдено на 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) 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) на com.sun.jersey.api.client.WebResource $ Builder.post (WebResource.java:563) на com.nec.jp.pflow.unc.service.EmployeeService .addEmployee (EmployeeService.java:44) at com.nec.jp.pflow.unc.controller.EmployeeController.addCustomer (EmployeeController.java:29) at sun.reflect.NativeMethodAccessorImpl.i nvoke0 (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.

Ниже приведен фрагмент кода.

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

Если вы нашли решение, вы можете оставить, что в качестве ответа и выбрать его самостоятельно. В противном случае этот вопрос остается без ответа. – Patrick

ответ

7

Простое копирование раствора из выше вопрос, только в случае, если кто-то ищет ответ.

Использование ДЖЕКСОНА-картографа апи для преобразования 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)); 
1
JSONObject object=new JSONObject(); 

необходимость обеспечить @XMLrootElement аннотацию .... если доступ к веб-службе от удаленного ... т. е. XML-сопоставление .. для класса модели.

0

Вы также можете использовать объект() методы для достижения этой цели, а именно:

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()); 
0

Ошибка Какое получение m немного немного отличается, но, наконец, решение работает для меня

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 
11

Лучший способ сказать 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

После много чтения здесь есть решение, которое я прибыл в:

Если вы используете ДЖЕРСИ-КЛИЕНТ, как указано ниже версии 1.9 или выше

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

Затем используйте MOXY Jar, как указанные ниже версии 2.19 или выше

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

И затем добавить 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); 
    } 
} 
Смежные вопросы

 Смежные вопросы