網上好多關於該類問題提問,但好像沒有好的答案,自己一直也很疑惑,今天終於在spring實戰(四次版,翻譯版),P438頁找到了答案
這個問題其實就是一個消息格式轉換的問題,spring提供了消息轉換器可以讓json和java對象之間轉換,
如果我們使用的pojo對象你會發現對象轉換正常,但是我們使用Lsit或Map作爲數據對象時候會出現415媒體類型錯誤
@RequsetBody和@ResponseBody其實就是兩類消息轉換器,使用指定格式對消息進行轉換
如果想自定義請求的消息轉換格式可以使用@RequestMapping(consumes="application/json")
如果想指定響應的消息轉換格式可以使用@RequestBodyMapping(produces="application/json")
或者直接使用@RestController註解,就不必爲每個方法添加@RequestBody和@ResponseBody了
當然如果使用的xml格式可以使用application/xml,甚至使用*/*
測試代碼如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/rest")
public class RestApiContoller {
@RequestMapping(value = "/api",method = RequestMethod.POST,
produces = "application/json",
consumes = "application/json"
)
public @ResponseBody
List<String> testArrayData(@RequestBody List<String> strgs){
return strgs;
}
}
今天去測試了下公司代碼,公司代碼不是使用的Spring的註解規範,使用的JAX-RS的註解規範,發現該方案並不能行
折騰好長時間才搞明白,jax-rs規範有個配置<jaxrs:provider><bean ref="jsonProvider" /></jaxrs:provider>
不同集成方式可能配置形式不同,但是關鍵信息就是要配置json的provider消息轉換器,當然如果需要先關的依賴也得添加
關於CXF的JAX-RS我自己也是不是很懂,需要了解的話,可以訪問官網瞭解下:
http://cxf.apache.org/docs/jax-rs.html
其中和CXF相關的兩個java擴展協議
JAX-RS : java extension REST
JAX-WS: java extension Web Service
這兩個大致意思是我憑自己的理解猜的,哈哈!
百度下別人給的全稱:
JAX-WS:全稱是JavaTM API for XML-Based Web Services
JAX-RS :全稱是 JavaTM API for RESTful Web Services