EndpointからJSONを取得しようとした場合の406エラー
-
25-09-2019 - |
質問
私はこの性質の他のいくつかの質問を見ましたが、彼らは法案に完全に適合しませんでした。
私は現在、2つの異なるコントローラーからJSONを返しようとしています。私のコントローラーの1つでは、問題なく動作しますが、2番目のエンドポイントに達したときに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>();
}
}
コントローラーコードからわかるように、私の結果リストは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結果リストを返します。これには@XMLELEMENTが注釈が付けられ、リストに含まれるオブジェクトにも@XMLelementが注釈が付けられます。これは、他のシナリオを機能させるために私がしなければならなかったことです。しかし、これは失敗します。誰かが私になぜ私に言うことができますか?
解決 2
public class ResultsList<T> {
private List<T> mResults;
@JsonGetter("results")
public final List<T> getResults() {
return mResults;
}
}
他のヒント
によると HTTP応答コードのリスト 406(受け入れられない)手段
要求されたリソースは、リクエストに送信された受け入れヘッダーに従って受け入れられないコンテンツのみを生成できます。
したがって、おそらくXMLを許容できるようにするヘッダーを設定していないでしょう。通常、JavaScriptはデフォルトでJSONを期待しています。したがって、受け入れヘッダーを設定するには、次のようなものを使用します。
function getCompany() {
var client = new XMLHttpRequest();
client.open("GET", "/v1/companies/name/exampleCompany");
client.setRequestHeader("Accept", "application/xml");
client.send();
}
または、代わりにアプリケーション/JSONを作成するようにWebサービスを設定することもできます。
確実に <mvc:annotation-driven>
春のMVCコンテキストにあります。このエラーは、Spring MVCが@ResponseBodyを認識していない場合に発生します(httpmessageconverter(s)を登録していない)ため、結果オブジェクトを古いファッションモデルとヴィューに変換しようとします。