Spring MVC @ResponseBody返回一个List

时间:2013-12-11 09:41:35

标签: java spring web-services

我们想创建一个返回特定对象列表的“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转换为实体......

7 个答案:

答案 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依赖项。