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