2014-02-21 5 views
2

spring rest 템플릿을 사용하여 json 배열을 요청으로 보냅니다. 요청을 보낼 수있는 소스 코드는 다음과 같다 :Spring Rest JsonArray를 보낼 템플릿

JSONArray jsonArray = new JSONArray(); 

for (Iterator iterator = itemlist.iterator(); iterator.hasNext();) { 

    Item item = (Item)iterator.next(); 

    JSONObject formDetailsJson = new JSONObject(); 

    formDetailsJson.put("id", item.getItemConfId()); 
    formDetailsJson.put("name", item.getItems().getItemName()); 
    formDetailsJson.put("price", item.getPrice()); 
    formDetailsJson.put("Cost",item.getCost()); 

    jsonArray.put(formDetailsJson); 
} 


List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>(); 
acceptableMediaTypes.add(MediaType.APPLICATION_JSON); 

// Prepare header 
HttpHeaders headers = new HttpHeaders(); 
headers.setAccept(acceptableMediaTypes); 
// Pass the new person and header 
HttpEntity<JSONArray> entity = new HttpEntity<JSONArray>(jsonArray, headers); 

System.out.println("Json Object : "+entity); 
// Send the request as POST 
try { 
    ResponseEntity<String> result = restTemplate.exchange("my url", HttpMethod.POST, entity, String.class); 

} catch (Exception e) { 
    logger.error(e); 

    return "Connection not avilable please try again"; 
} 

받아 들일 요청 :

@RequestMapping(value = "/testStock", method = RequestMethod.POST,headers="Accept=application/xml, application/json") 
    public @ResponseBody int testStock(@RequestBody List<ItemList> jsonArray) { 

     logger.debug("Received request to connect ms access : "+jsonArray.size()); 

     //int returnSizecount = stockList.getStocklst().size(); 

     return 1; 
    } 

문제는 나에게 다음과 같은 오류를 제공한다는 것입니다 : 요청을 쓸 수 없습니다 : 요청을 찾을 수 없습니다 적합 HttpMessageConverter를 type [org.json.JSONArray]. 어떤 제안이라도 대단히 수용 가능합니다.

답변

3

JSONArray 용 MessageConverter가 없으므로 다음을 수행하는 것이 좋습니다.

HttpEntity<JSONArray> entity = new HttpEntity<JSONArray>(jsonArray, headers); 

클래스 JSONArray는 문자열로 변환하고, HttpEntity에 그를 추가, 당신은 toString에게

java.lang.String toString()

 Make a JSON text of this JSONArray. 

HttpEntity 실체 = 새로운 HttpEntity (jsonArray.toString(), 헤더)를 사용하여 알고

또는 Jackson 구현으로 변경하십시오. Spring에서이를 지원합니다. XD

당신이 위의 할 일을하지만,에

열심히 업데이 트를

HttpHeaders headers = new HttpHeaders(); 
headers.setAccept(acceptableMediaTypes); 
headers.setContentType(MediaType.APPLICATION_JSON); 

업데이트 2 변경 엔드 포인트 인 것,는 MessageConverter의 자신의 구현을 작성하는 것이 좋습니다 해달라고합니다.

@RequestMapping(value = "/testStock", method = RequestMethod.POST) 
    public @ResponseBody int testStock(@RequestBody String jsonArray) { 
+0

이 tostring으로 변환(). 요청 수락을 위해 서버 측에서 415 개의 지원되지 않는 미디어 유형을 제공합니다. – User

+0

header.setContentType (MediaType.APPLICATION_JSON)과 같은 헤더를 추가하면 서버에 문자열이 json임을 알리고, 작동하는지 알려 주면 – Koitoer

+0

이미 내 코드에서 미디어 유형으로 추가했습니다. 서버 측에서해야할 일은 내 코드에서 testStock 메소드를 의미합니다. – User

1

당신은 당신이 추가 할 수 있습니다 JSON하기 위해 HTTP 요청을 변환하는 당신이

http://stackoverflow.com/questions/19963127/new-to-spring-and-jackson-2-what-does-this-bean-declaration-allow-for-in-a-spri/19973636#19973636. 

을 웹 서비스에 대한 HTTP 메시지 conveter을 구성하는 내 게시물을 읽고 문제에 대한하십시오 httpmessageconverter이 resttemplate에 대해 구성이 필요합니다 당신의 restemplate 구성의이 항목

<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
+0

JsonArray가 Jackson libs에 속해 있지 않기 때문에 jsonarray가 해당 MessageConverter로 변환 될 수 없다고 생각합니다. – Koitoer

0

오류는 매우 간단합니다. JSONArray에 대한 변환기가 없습니다. 문자열 (사용 toString)에 배열을 변환하면 여기에 당신을 도울 수 있지만, 더 좋은 방법이 않았다

는 그냥 json.org 개체에 대한 변환기를 추가

당신의 pom.xml 파일이 추가가

그리고 다음에

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-json-org</artifactId> 
    </dependency> 
당신의 ObjectMapper JsonOrgModule을 추가

mapper.registerModule(new JsonOrgModule());