読者です 読者をやめる 読者になる 読者になる

なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

SpringアプリケーションでJSONレスポンスを返却するときに"406 Not Acceptable"が発生したときの話

背景

@RestControllert使ってJSONレスポンスを返すようにして、アクセスしてみたら以下のエラーが発生しました。その際の対応をメモっておきます。
(以下レスポンス(HTML)の抜粋)

406 Not Acceptable
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

結論

ライブラリが足りていなった。
以下のライブラリが必要でした。jackson-coreは取り込んでいましたが、jackson-databind(旧jackson-mapper-asl)を取り込んでいませんでした。
取り込んだら正しくJSON形式で返却するようになりました。

    <dependency>
   	  <groupId>com.fasterxml.jackson.core</groupId>
	  <artifactId>jackson-core</artifactId>
	  <version>2.6.0</version>
    </dependency>
    <dependency>
	  <groupId>com.fasterxml.jackson.core</groupId>
	  <artifactId>jackson-databind</artifactId>
	  <version>2.6.0-rc4</version>
    </dependency>

対応メモ

今回のトラブルシューティングと関係ないことについても備忘録的にメモっときます。

コントローラ

  • @RestControllerを使えば、@ResponseBodyをつけなくてもHttpMessageConverterによる変換が行われる。(=ViewResolverは呼ばれない。)。もちろんつけても動作する。
  • 上記のライブラリ取り込み忘れ時でもメソッド自体は呼び出されていたので、レスポンス変換に失敗するケースは”406”が返却されるらしい(=StringHttpMessageConverterが選択されてtoString()の内容が返されることはない)。
  • UserApiController.java
@RestController
public class UserApiController {

    @Autowired
    private UsersDao usersDao;

    @RequestMapping(value = "/api/users", method = GET)
    public List<User> get() {
        return usersDao.selectAll();
    }
}

Spring設定

  • spring-context.xml(自分の場合)、特に追加は不要。"MappingJacksonHttpMessageConverter"は自動登録させるため。

所感

  • エラーメッセージが直接的ではなかったので原因がわかるまで時間がかかった(;´Д`)
  • 最近Springの公式サイトはAll-in-Oneのようなプロジェクト前提で説明が書かれているため("こうするだけで実現できます"とか)、細かい前提は違うと実現に結構苦労する(;´Д`)

参考

Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ

Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ