【问题标题】:Spring MVC @ResponseBody returning a Map produces "Error 406 NOT ACCEPTABLE"返回 Map 的 Spring MVC @ResponseBody 产生“错误 406 不可接受”
【发布时间】:2011-11-12 07:21:10
【问题描述】:

我在尝试设置 @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);
}

当我执行上述操作时,我收到“错误 406 不可接受”。

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

谢谢。

【问题讨论】:

  • 这里的任何解决方案都有效吗?

标签: xml spring spring-mvc jaxb


【解决方案1】:

需要在 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>

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,经过几个小时的调试,我终于找到了解决方案。以防其他人遇到同样的问题,这就是我发现的。

    您可能关注了Ajax Simplifications in Spring 3,它告诉您使用 mvc:annotation-driven 配置元素。

    它没有告诉您的是 mvc:annotation-driven 只是定义几个标准 bean 的快捷方式,除非您已经定义了其中一个 bean!

    使用 mvc:annotation-driven 配置,MappingJacksonHttpMessageConverter 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 上注册为 messageConverter。

    如果你已经定义了自己的 AnnotationMethodHandlerAdapter,你也应该手动定义这个 MappingJacksonHttpMessageConverter 。

    Cfr Custom message converters registered with AnnotationMethodHandlerAdapter are not used, only the default ones are used. 讨论了类似的问题。 还要检查 SPR-6524 和 SPR-6306,由于防止垃圾邮件,无法发布链接:(

    我的 spring 配置中的相关部分最终看起来像这样:

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="webBindingInitializer">
                <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
                    <property name="validator">
                        <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
                        </bean>
                    </property>
                </bean>
            </property>
             <property name="messageConverters">
                <list>   
                    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter"/>
                </list>
            </property>
    </bean>
    

    【讨论】:

      【解决方案3】:

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

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

      请注意,我使用的是 1.x 版本(在我的例子中是 1.9),而不是 2.x。上一个版本不适合我。

      【讨论】:

        【解决方案4】:

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

        @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;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-17
          • 1970-01-01
          • 1970-01-01
          • 2013-04-26
          • 2014-04-11
          • 1970-01-01
          • 1970-01-01
          • 2016-03-08
          相关资源
          最近更新 更多