Spring MVC @ResponseBody返回一个List
我们想创建一个“WebService”,它返回特定对象的列表。 我们想通过apache http客户端库从另一个java程序中调用这个web服务。
此时,如果我们从Firefox调用Web服务,则会出现406错误页面。
我们是否必须使用JSON或XML来传输列表? 怎么做,以及如何使用apache http客户端获取列表?
谢谢。
[编辑]
唯一有效的方法是使用JAXB注释创建一些实体,以便序列化为XML。
@XmlRootElement(name = "person") public class Person { private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } @XmlRootElement(name = "persons") public class PersonList { @XmlElement(required = true) public List persons; public List getData() { return persons; } public void setData(List persons) { this.persons = persons; } } @RequestMapping(value = "/hello.html", method = RequestMethod.GET, produces = "application/xml") @ResponseBody public ResponseEntity hello() { PersonList test = new PersonList(); List rep = new ArrayList(); Person person1 = new Person(); person1.setId("1"); Person person2 = new Person(); person2.setId("2"); rep.add(person1); rep.add(person2); test.setData(rep); // return test; HttpHeaders responseHeaders = new HttpHeaders(); List medias = new ArrayList(); medias.add(MediaType.ALL); responseHeaders.setAccept(medias); return new ResponseEntity(test, responseHeaders, HttpStatus.OK); }
我尝试使用产生并直接返回对象,但仍然是错误406.XML + ResponseEntity工作。
这很奇怪,因为我看到一个非常简单的例子,将对象转换为json并出现在Web浏览器中。
所以,现在我必须了解如何获得响应并将XML转换为实体……
是的,当您的控制器方法使用@ResponseBody
注释时,Spring @ResponseBody
返回的数据转换为JSON 。
@ResponseBody
注释告诉Spring我们将在响应主体中返回数据而不是呈现JSP。
使用@ResponseBody
注释时,Spring将以客户端可接受的格式返回数据。 也就是说,如果客户端请求有一个标头来接受json并且类路径中存在Jackson-Mapper,那么Spring将尝试将返回值序列化为JSON。 如果请求头指示XML为可接受( accept=application/xml
)并且Jaxb在类路径中并且返回类型使用Jaxb注释进行注释,则Spring将尝试将返回值编组为XML。
@ResponseBody将根据请求的Accept标头以及类路径中JSON和/或XML库的存在,自动将您返回的对象编码为适当的格式。
定义您自己的对象以包装列表可能更容易/更安全,而不是直接返回列表 – 因为这可以让您更好地控制编码,并允许您将来可能添加其他数据。
在2天内,我尝试了很多方法: – responseEntity – httpheaders – XML等…
对于JSON(默认行为),项目需要一个包含所有Spring库的库。 这里是在Maven项目中声明的库。
org.codehaus.jackson jackson-mapper-asl 1.7.1
没有这个库,我有一个错误(406)。
无论如何,谢谢您的所有答案和建议。
您应该使用ResponseEntity
。 @ResponseBody
绝对无法控制响应。
您可以使用spring mvc框架构建REST服务。 它将返回JSON / XML。 并使用HTTP客户端/ rest模板调用这些服务,并使用返回的JSON显示信息。
Spring控制器也可以返回一个对象,对象列表。 一些映射(Jackson和JAXB)将允许它将对象转换为JSON / XML。
如果您的服务接受请求数据,您可以将对象发送到服务并获取响应数据。
您也可以使用Grails框架。
实际上,您必须使用带有JSON / XML格式作为对象表示的REST Web服务。 我更喜欢JSON,因为它的重量非常轻。
首先,您需要在Pom.xml中添加依赖项
org.codehaus.jackson jackson-mapper-asl 1.7.1
你的方法处理程序在这里
@ResponseBody @RequestMapping(value = "/your URL") public ArrayList getInboxPage(@RequestParam int var,HttpSession session) { ArrayList fooList=new ArrayList (); fooList.add(1L); fooList.add(2L); fooList.add(3L); return fooList; }
注意:如果在方法处理程序中编写@ResponseBody批注,则Spring会自动生成JSON,您不需要在pom.xml文件中添加Jackson依赖项。