2011-10-24 10 views
1

私はSpring MVC 3/J2EEプロジェクトを持っています。 JSPレンダリング・コントローラーは正常に動作していますが、Ajax用にXMLをレンダリングするコントローラーは動作しません。私はRAD 7.5でJDK 1.6を使用しているので、JAXBはクラスパス上になければなりません。また、libファイルに最新のJAXB jarを追加しようとしました。 私はまだ電話をかけると406のエラーが発生します。私のDOJOの電話はhandleAs: "xml"で、application/xmlはFireBug経由でAcceptヘッダーにあることを確認しました。私は春のサーブレットxmlファイルに<mvc:annotation-driven />行を持っています。メソッドが呼び出され、エラーなしで戻ることがわかります。私はデバッグするために次に何を試すべきかはわかりません。あなたのビュー/ビューリゾルバを設定しているか見ずに言うのは難しい@ResponseBodyでJavaを生成していない6

//Country is a class with only primative types which implements Serializable. 
public @ResponseBody List<Country> getCountries(){ 
    return addressService.getCountries(); 
} 

function loadData(){ 
    console.log("Before get ..."); 
    dojo.xhrGet({ 
     url:"http://localhost:9080/sample/shared/getCountries.htm", 
     handleAs:"xml", 
     load: function(data){ 
      console.log("In load function ..."); 
      try { 
       for(var i in data){ 
        console.log("key", i, "value", data[i]); 
       } 
      }catch (ex){ 
       console.error("Failure in load function: " + ex); 
      } 
      console.log("Exiting load function ..."); 
     }, 
     error: function(x){ 
      console.error("Error in ajax ..."); 
      console.error(x); 
     }, 
     failOk: false 
    }); 
    console.log("After get ..."); 
} 

答えて

4

次のラッパークラス作成してみてください:

@XmlRootElement 
class Countries { 
    private List<Country> countries = new ArrayList<Country>() 

    //getters/setters 
} 

を、代わりに生のリストのコントローラからそれを返す:

public @ResponseBody Countries getCountries() 

ほとんどの問題は、マーシャリングすることができませんJAXBによって引き起こされますJavaのリスト(XML文書のルートタグに名前を付ける方法はわかりません)。 JSONでデータを要求しているとき(JacksonがCLASSPATHで使用可能な場合)、問題はおそらく発生しないことに注意してください。

は(同様の問題)も参照してください:

+0

これが '406'を引き起こすと私は驚くでしょうが、私はラッパーが必要であることに同意します。 – SingleShot

+0

ええ、私はこれを別の答えで見ました。今日それを試してみてください。 –

1

。しかし、.htmを含むクライアント側のURLは、特にContentNegotiatingViewResolverを使用している場合は、私の疑いがあります。ファイル拡張子を削除することをお勧めします。ブラウザは自動的にAcceptヘッダーをHTMLに使用しますので、拡張子を使用する必要はありません。

+0

が明らかに正常に動作しているビューリゾルバは、以来、 "私は、メソッドが呼び出され、エラーなしで返却されて見ることができます。" –

+0

申し訳ありませんが、あなたのために十分速くはありませんでした:-)。 –

+0

「メソッドを返す」は、ビュー解像度の前に発生するため、正しく設定されているサーバー側のインジケータではありません。 – SingleShot