2011-09-07 7 views
14

@ResponseBodyを設定してコレクションを返そうとするときに問題があります。クラスパスにJAXB jarがあり、ContentNegotiatingViewResolverを設定していません。Mapを返す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

この2つの依存関係が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

私は同じ問題を抱えていましたが、2時間のデバッグ後に私は最終的に解決策を見つけました。他の人が同じ問題を抱えている場合に備えて、これは私が見つけたものです。

おそらく、Ajax Simplifications in Spring 3に続いて、mvc:annotation-driven構成要素を使用するように指示しました。

mvc:annotation-drivenは、すでに定義されているBeanの1つを持っていない限り、いくつかの標準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をチェックによるスパム防止へのリンクを投稿することができません:(

私の春のconfigに関連する部分はこのように見てしまった:

<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

私はこの質問を知っています少し古いですが、私は同じ問題を抱えていた

私はパスを2瓶構築するために追加解か:。http://wiki.fasterxml.com/JacksonDownloadか、Mavenを使用する場合は挙の依存関係として追加することができます:あなたはここからダウンロードできjackson-core-asl-1.x.jarjackson-mapper-asl-1.x.jarを。

私はバージョン1.x(私の場合は1.9)で、2.xでは使用していないことに注意してください。最後のバージョンは私のためには機能しませんでした。

関連する問題