网上好多关于该类问题提问,但好像没有好的答案,自己一直也很疑惑,今天终于在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