Spring MVC @ResponseBody返回一个Map会产生“Error 406 NOT ACCEPTABLE”

时间:2011-09-07 15:55:24

标签: xml spring spring-mvc jaxb

我在尝试设置@ResponseBody以返回集合时遇到问题。我在类路径中有JAXB jar,我没有设置任何ContentNegotiatingViewResolver。

这是我的简单对象: -

@XmlRootElement(name = "test-object")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestObject implements Serializable {

    @XmlAttribute
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

我编写了一个返回单个对象的简单测试...这没有问题,我能够看到生成的XML: -

@RequestMapping(value = "one", method = RequestMethod.GET)
public @ResponseBody TestObject getSingleObject() {
    TestObject obj = new TestObject();
    obj.setId(1);

    return obj;
}

我真正想要的是返回一个对象列表。阅读后,似乎这样做的方法是将列表放在地图中并返回地图: -

@RequestMapping(value = "all", method = RequestMethod.GET)
public @ResponseBody Map<String, ? extends Object> getAllObjects() {
    TestObject obj1 = new TestObject();
    obj1.setId(1);

    TestObject obj2 = new TestObject();
    obj2.setId(2);

    List<TestObject> list = Arrays.asList(obj1, obj2);

    return Collections.singletonMap("all-objects", list);
}

当我执行上述操作时,我收到“Error 406 Not Acceptable”。

我在这里做错了什么?我正在Jetty 6.1上运行,如果这有所不同。

感谢。

3 个答案:

答案 0 :(得分:10)

您需要在pom.xml中添加这两个依赖项!

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-lgpl</artifactId>
    <version>1.8.1</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.8.1</version>
</dependency>

答案 1 :(得分:2)

我知道这个问题有点陈旧,但我遇到了同样的问题。

我解决了添加到构建路径的两个罐子:jackson-core-asl-1.x.jarjackson-mapper-asl-1.x.jar。您可以从这里下载它们:http://wiki.fasterxml.com/JacksonDownload或者如果您使用Maven,您可以将它们添加为项目依赖项。

请注意,我使用的是版本 1.x (1.9,在我的情况下),而不是2.x.最新版本对我不起作用。

答案 2 :(得分:0)

更多的建议而不是答案,但您是否尝试创建地图然后添加对象然后只返回这样的地图?

@RequestMapping(value = "all", method = RequestMethod.GET)
public @ResponseBody Map<String, ? extends Object> getAllObjects() {
    TestObject obj1 = new TestObject();
    obj1.setId(1);

    TestObject obj2 = new TestObject();
    obj2.setId(2);

    List<TestObject> list = Arrays.asList(obj1, obj2);
    Map<String, Object> map = new TreeMap<String, Object>();
    map.put("all-objects",list);
    return map;
}