Server:
@RequestMapping(value = { "/hygiene/{phone}" }, method = {RequestMethod.POST },produces="application/json") @ResponseBody public PhoneResult hygiene(@PathVariable("phone")String phoneObject) { PhoneResult result = new PhoneResult(); try { ObjectMapper mapper = new ObjectMapper(); Phone phone = mapper.readValue(phoneObject, Phone.class); result.setRawPhoneNumber(phone.getPhoneNumber()); result.setFormat("4+4+4"); result.setCleanInternationalNumber("86 0513 23234442"); result.setCleanNationalNumber("0513 23423423"); result.setPreferredPresentation("513 234234234"); }catch (Exception e) { e.printStackTrace(); result.setCleanInternationalNumber("error"); } return result; }
Client:
MultiValueMap<String,Object> dataMap2 = new LinkedMultiValueMap<String, Object>(); Phone p = new Phone(); p.setPhoneNumber("0513 23423423"); dataMap2.add("phone", JsonUtil.javaToJson(p)); HttpEntity<Object> entity2 = new HttpEntity<Object>(dataMap2); PhoneResult result = this.restTemplate.postForObject("http://localhost:8080/restServer/helloworld/hygiene/{phone}.spring", entity2, PhoneResult.class, dataMap2);
public static String javaToJson(Object o) throws Exception{ StringWriter writer = new StringWriter(); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(writer, o); String json=writer.toString(); return json; }
遇到的异常: server端转化json失败:
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.pojo.Phone out of START_ARRAY token at [Source: java.io.StringReader@55afbf49; line: 1, column: 1] at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198) at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeUsingCreator(BeanDeserializer.java:565) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:365) at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2391) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1591) at com.acxiom.rest.controller.HelloWorldController.hygiene(HelloWorldController.java:52)
Debug了一下程序,发现传进来的json字符串是数组格式的:
[{"phoneNumber":"0513 XXXXX","phoneType":"1","countryCode":"1","geoOption":"1","defaultOption":"1","geoLat":"1","geoLong":"1"}]
果断修改了Server端代码:
ObjectMapper mapper = new ObjectMapper(); Phone phone = mapper.readValue(phoneObject, Phone[].class)[0];
问题解决。