2010-11-17 106 views
1

我看到了其他一些這種性質的問題,但他們不太適合這個法案。嘗試從端點檢索JSON時出現了406錯誤

我目前正試圖從兩個不同的控制器返回JSON。在我的一個控制器中,它可以正常工作,但是當我打到第二個端點時,出現406錯誤,我無法弄清楚什麼是錯誤的。這裏的控制器動作:

@RequestMapping("/v1/companies/name/{companyName}") 
public @ResponseBody ResultsList<CompanyResult> getCompaniesByName(@PathVariable("companyName") String companyName) { 

    if (StringUtils.isEmpty(companyName)) { 
     throw new HttpMessageNotReadableException("blah"); 
    } 

    ResultsList<CompanyResult> results = companySearchService.getCompaniesByName(companyName); 

    return results; 
} 

以下是我正在試圖返回模型:

public class ResultsList<T> { 
    @XmlElement(name = "results") 
    private ArrayList<T> results; 

    public int resultCount() { 
     return this.results.size(); 
    } 

    public void addResult(T result) { 
     this.results.add(result); 
    } 

    public ResultsList() { 
     this.results = new ArrayList<T>(); 
    } 
} 

正如你可以從控制器代碼中看到的,我的ResultsList由CompanyResult對象:

public class CompanyResult implements ICompany { 
    @XmlElement(name = "companyName") 
    private String companyName; 

    @XmlElement(name = "symbol") 
    private String symbol; 

    @XmlElement(name = "city") 
    private String city; 

    @XmlElement(name = "state") 
    private String state; 
...... 

所以我的控制器返回一個@RequestBody ResultsList,它用@XmlElement註釋,列表中的對象也用@XmlElement註解。這是我必須做的,以使其他場景正常工作。但是這個失敗了。誰能告訴我爲什麼?

回答

1
public class ResultsList<T> { 
    private List<T> mResults; 

    @JsonGetter("results") 
    public final List<T> getResults() { 
     return mResults; 
    } 

} 
2

根據the list of HTTP response codes 406(不接受)指

所請求的資源僅能夠 生成內容根據Accept標頭不能接受 的請求中發送 。

因此,您可能沒有設置Accept標頭以允許XML被接受。通常情況下,JavaScript默認使用JSON。因此,要設置Accept頭使用類似如下:

function getCompany() { 
var client = new XMLHttpRequest(); 
client.open("GET", "/v1/companies/name/exampleCompany"); 
client.setRequestHeader("Accept", "application/xml"); 
client.send(); 
} 

或者,你可以設置你的web服務產生應用程序/ JSON代替。

+0

謝謝您的回覆,但我對您的回覆感到困惑。我的GET請求(使用jQuery.get())要求提供JSON。我認爲我的控制器也會返回JSON。您的評論意味着我的控制器正在返回xml。我的其他控制器正在返回JSON而未被明確告知這麼做,所以我不知道爲什麼這個控制器會有任何不同。 – Samo 2010-11-17 20:57:26

+0

您是否試過要求XML並查看響應代碼是否更改? – 2010-11-17 21:00:55

+0

另外,你可以發佈你的Spring配置文件嗎? – 2010-11-17 21:12:14

1

確保<mvc:annotation-driven>位於Spring MVC上下文中。 當Spring MVC無法識別@ResponseBody(沒有註冊HttpMessageConverter(s))並因此嘗試將結果對象轉換爲舊時尚ModelAndView時,會發生此錯誤。