2012-08-21 7 views
9

Estoy utilizando el cliente de jersey para hacer que call to rest webservice.No se encontró un escritor de cuerpo de mensaje para el tipo de Java, clase net.sf.json.JSONObject y tipo de medio MIME, application/json

Mi servicio web está consumiendo el json, así que tengo que poner json al hacer una llamada a mi proveedor de servicios web.

Lo estoy haciendo de la siguiente manera.

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

pero yo estoy recibiendo el siguiente excepción:

09: 52: 01,625 ERROR [[mvc-despachador]] Servlet.service() para servlet mvc-despachador arrojó excepción com .sun.jersey.api.client.ClientHandlerException: un escritor de cuerpo de mensaje para el tipo de Java, clase net.sf.json.JSONObject y MIME media tipo, aplicación/json, no se encontró en com.sun.jersey. api.client.RequestWriter.writeRequestEntity (RequestWriter.java:288) en com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke (URLConnectionClientHandler.java:204) en com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle (URLConnectionClientHandler.java:147) en com.sun. jersey.api.client.Client.handle (Client.java:648) en com.sun.jersey.api.client.WebResource.handle (WebResource.java:670) en com.sun.jersey.api.client. WebResource.access $ 200 (WebResource.java:74) en com.sun.jersey.api.client.WebResource $ Builder.post (WebResource.java:563) en com.nec.jp.pflow.unc.service.EmployeeService .addEmployee (EmployeeService.java:44) en com.nec.jp.pflow.unc.controller.EmployeeController.addCustomer (EmployeeController.java:29) at sun.reflect.NativeMethodAccessorImpl.i nvoke0 (Nativo Método) en sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) en sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)

Pero si puedo convertir mi JSON para cadena de representación como:

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

y funciona bien.

Sugiera cómo puedo poner mi objeto JSON sin obtener la excepción anterior. ¿Cuál es la mejor manera?

Gracias de antemano.


Obtuve una solución para lo anterior. Ahora estoy haciendo uso de la api jackson-mapper para convertir el POJO en json.

A continuación se muestra el fragmento de código.

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

Si has encontrado una solución, puede publicar que a medida que la respuesta y seleccionarla usted mismo. De lo contrario, esta pregunta parece sin respuesta. – Patrick

Respuesta

7

sólo copiar la solución de la pregunta anterior, por si acaso alguien está buscando respuesta.

API

Uso Jackson mapeador para convertir el POJO a JSON como se muestra en el siguiente fragmento de código:

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

necesidad de proporcionar @XMLrootElement anotación .... si está accediendo al servicio web desde remoto ... es decir, asignación de XML ... para la clase de modelo.

0

También puede utilizar la entidad() métodos para lograr esto, de la siguiente manera:

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

o

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

la adición de un .toString() trabajó para mí:

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

Error Lo que obtengo es un poco diferente pero finalmente la solución me funciona

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) 

y esto se trabaja solución para mí:

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

Una mejor manera es decirle jersey-client que puede utilizar jackson para la serialización: https://stackoverflow.com/a/2580315/516188

pegar la configuración:

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

JacksonJsonProvider está en jackson-jaxrs-json-provider paquete.

1

Después de mucho leer aquí es la solución que llegué a:

Si está utilizando JERSEY-CLIENTE como se especifica como a continuación de la versión 1.9 o superior

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

continuación, utilizar el tarro MOXY como se especifica a continuación de la versión 2.19 o superior

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

y luego añadir la MOXyJsonProvider.class en la clase de configuración de cliente, como se muestra a continuación:

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

Ahora crea la configuración necesaria para objetos de cliente para conectarse al servidor y ejecutar la solicitud:

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