1

まず、私は Spring の初心者であり、Spring を使用して REST ベースのアプリケーションを作成するのはこれが初めての試みです。

リクエスト パラメータとレスポンスの両方で Json を使用する予定です。これは私に2つの質問をもたらします。

  1. produces="application/json"すべての mvc コントローラー応答のデフォルトとしてグローバルに設定する方法はありますか?

  2. 誰かがリクエストを送信し、結果が 以外の形式であると期待している場合application/json、エラー メッセージを返したいと思います。これはインターセプターの責任だと思いますが、チェックの設定方法を理解しています。

4

2 に答える 2

2

実際にはもっと簡単です。Acceptコントローラーから Java オブジェクトを返すだけで、Spring はヘッダーに基づいて使用するフォーマットを判断します。

@ResponseBody
public MyPojo noView(@RequestBody request) {
  return new MyPojo();
}

リクエストに対しても同じことが行われます。Spring MVC は、リクエスト ボディからrequestオブジェクトへの変換に最善を尽くします。構成が完了すると (たとえば、JSON を処理するために CLASSPATH が必要jackson*.jarになります)、そのまま機能します。

また、XML は無料で入手できるため、エンドポイントを JSON に制限しても意味がありません。ユーザーが他の形式を要求した場合、Spring は適切なエラー メッセージを送信します ( Bad request ?)

こちらもご覧ください

于 2012-07-29T11:28:33.550 に答える
0

グローバルに設定する方法はなくproduces、Tomasz が示唆したように、通常はコンテンツ ネゴシエーションを春に任せる方が簡単ですが、機能をインターセプターとして実装することも非常に簡単です。

Accept基本的に、値としてヘッダーを持たないリクエストでは、415 ステータス コードを返す必要がありapplication/jsonます。

したがって、最初にインターセプターを実装します。

public class WrongAcceptHeaderInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler) throws Exception {
        if (!"application/json".equals(request.getHeader("Accept"))) {
            //you can change or omit the message 
            response.sendError(SC_UNSUPPORTED_MEDIA_TYPE, "Your error message"); 
            // return false to skip further processing
            return false;
        }
    }
}

次に、コンテキストに登録します。

<mvc:interceptors>
    <bean class="foo.bar.baz.WrongAcceptHeaderInterceptor" />
</mvc:interceptors>
于 2012-07-29T15:22:40.530 に答える