2011-09-07 97 views
14

我在試圖建立到@ResponseBody返回集合的問題。我在classpath中有JAXB jar,並且沒有設置任何ContentNegotiatingViewResolver。Spring MVC的返回@ResponseBody一個地圖產生「錯誤406不可接受」

這是我簡單的對象: -

@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上運行。

謝謝。

+1

做了這裏的任何解決方案工作? – Ram

回答

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; 
} 
+0

沒有爲我工作。 – limc

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> 
5

我有同樣的問題,經過幾個小時的調試,我終於找到了解決方案。以防萬一別人遇到同樣的問題,這就是我發現的。

你可能跟着Ajax Simplifications in Spring 3它告訴你使用MVC:註解驅動的配置元素。

它沒有告訴你的是,mvc:annotation-driven只是一個定義一對標準bean的捷徑,除非你已經定義了其中的一個bean!

使用mvc:註釋驅動的配置,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> 
2

我知道這個問題是有點老了,但我有同樣的問題

我解決了添加到構建路徑兩個jar:。jackson-core-asl-1.x.jarjackson-mapper-asl-1.x.jar你可以從這裏下載:http://wiki.fasterxml.com/JacksonDownload或者如果你使用Maven,你可以將其添加爲謨依賴。

請注意,我使用的版本是1.x(1.9,在我的情況下)而不是2.x.最新版本不適合我。

相關問題