2011-10-24 70 views
1

我有一個Spring MVC 3/J2EE項目。 jsp渲染控制器工作正常,但爲Ajax呈現XML的控制器無法正常工作。我在RAD 7.5中使用JDK 1.6,因此JAXB應該在類路徑中,我甚至嘗試將最新的JAXB jar添加到lib文件中以確保。 我撥打電話時仍然收到406錯誤。我的DOJO電話有handleAs: "xml",我確認application/xml是通過FireBug在Accept頭上。我在我的spring servlet xml文件中有<mvc:annotation-driven />行。我可以看到正在調用的方法,並返回沒有錯誤。我不確定接下來應該嘗試調試什麼。@ResponseBody不在Java中生成XML 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。我建議刪除文件擴展名。瀏覽器自動使用HTML標頭Accept,因此不需要使用擴展名。

+0

顯然視圖解析器正常工作,因爲 「我可以看到被調用,並沒有錯誤返回方法。」 –

+0

對不起,你的速度不夠快:-)。 –

+0

「方法返回」發生在視圖分辨率之前,因此不是服務器端配置正確的指標。 – SingleShot