1. ホーム
  2. java

[解決済み] Spring JSON リクエストが 406 (not Acceptable) になる。

2023-05-14 21:29:58

質問

これは私のjavascriptです。

    function getWeather() {
        $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
            alert('Success');                               
        });
    }

これは私のコントローラです。

@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET)
@ResponseBody
public Weather getTemparature(@PathVariable("id") Integer id){
    Weather weather = weatherService.getCurrentWeather(id);
        return weather;
}

spring-servlet.xml

<context:annotation-config />
<tx:annotation-driven />

このようなエラーが発生します。

GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)

ヘッダです。

レスポンスヘッダ

Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  1070
Date    Sun, 18 Sep 2011 17:00:35 GMT

リクエストヘッダ

Host    localhost:8080
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept  application/json, text/javascript, */*; q=0.01
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection  keep-alive
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/web/weather
Cookie  JSESSIONID=7D27FAC18050ED84B58DAFB0A51CB7E4

興味深いメモです。

私は406エラーを得ますが、ハイバーネートクエリは一方で動作します。 これは、ドロップボックスの選択を変更したときに、毎回、tomcatログに表示されるものです。

 select weather0_.ID as ID0_0_, weather0_.CITY_ID as CITY2_0_0_, weather0_.DATE as DATE0_0_, weather0_.TEMP as TEMP0_0_ from WEATHER weather0_ where weather0_.ID=?

何が問題なのでしょうか?以前SOで似たような問題が2つあり、そこで受け入れられたヒントをすべて試しましたが、うまくいかなかったようです...。

何か提案はありますか?遠慮なく質問してください...

どのように解決するのですか?

<ブロッククオート

406 受け入れられません

リクエストによって特定されたリソースは、リクエストで送信された accept ヘッダによって受け入れ不可能なコンテンツ特性を持つレスポンスエンティティを生成することができるだけです。

つまり、リクエストのacceptヘッダがapplication/jsonで、コントローラがそれを返すことができないということです。これは、@ResponseBody アノテーションの返り値を満たす正しい HTTPMessageConverter が見つからない場合に起こります。HTTPMessageConverter は、HTTP レスポンスメソッドを使用する際に自動的に登録されます。 <mvc:annotation-driven> を使用すると、クラスパスに特定の 3 次元パーティ・ライブラリが与えられると、HTTPMessageConverter が自動的に登録される。

クラスパスに正しい Jackson ライブラリーがないか、あるいは <mvc:annotation-driven> ディレクティブを使用していないかです。

あなたのシナリオを再現してみましたが、この二つのライブラリを使ってうまくいきました。 headers="Accept=*/*" ディレクティブは使用しません。

  • jackson-core-asl-1.7.4.jar
  • ジャクソン・マッパー・アスル-1.7.4.jar