3

私の要件は、Spring3.0とHibernateValidatorを使用してフォームのサーバー側検証を実行することです。AJAX呼び出しを使用してフォームを送信していることを忘れないでください。私のコントローラークラスコードは次のとおりです。

public ModelAndView generatePdfReport(@ModelAttribute("reports") @Valid ReportsCommand model, BindingResult result, ModelAndView modelAndView,
            HttpServletRequest request, HttpServletResponse response) throws Exception {


        if (result.hasErrors()) {

            throw new BindException(result);
        } 
        else{
           ...
           }

アップデート...

   @ExceptionHandler(BindException.class)
   public @ResponseBody String handleException(BindException e,HttpServletRequest request, HttpServletResponse response) 
   {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        return e.getMessage();

   }

これは、コントローラーに配置したハンドラーメソッドです。@ ResponseBodyアノテーションを使用しましたが、JSON形式ではなくhtml形式で応答が表示されています...コードの何が問題になっていますか。以下はフィールドIです。検証しています

@Size(min = 2, max = 3, message = "calltype must between 2 to 3 Characters.")
    private String callType;

サイズを3以上にすると、ifに入り、例外がスローされます。必要なのは、この例外を処理してjson応答を返したいということです。@ ExceptionHandlerを使用してこれを実行できる可能性がありますが、実行しないでください。または、この問題を解決するための他の解決策も大歓迎です。

4

4 に答える 4

5

バインディング エラーを JSON に自動的に変換する方法はありません。手動で行う必要があります。次の 2 つの場所で実行できます。

  • inline - BindException をスローする代わりに、JSON を生成して返します (JSON で動作するカスタム ModelAndView を使用するか、応答に書き込むことによって)
  • handle と宣言された例外ハンドラー内BindException。いくつかの(ベース)コントローラーのメソッドに注釈を付け@EXceptionHandler(BindException.class)、同じ変換エラーを実行します->上記とjson
于 2012-06-13T12:17:11.817 に答える
5

このパッケージをインポートする

import org.springframework.validation.BindException

これではない

import java.net.BindException
于 2018-01-19T02:46:30.157 に答える
3

Spring の現在のバージョンに関する最新情報を提供するために: 単に BindException(bindingResult) をコントローラー メソッドからスローすると、Spring はすべての検証エラーに関する情報を含む詳細な JSON 応答を返します。

@RestController のメソッド

@RequestMapping(value = "/ballot", method = POST)
public BallotModel postBallot(@Valid @RequestBody BallotModel newBallot, BindingResult bindingResult) throws BindException {
    log.trace("=> POST /ballot "+newBallot);
    log.debug("ballotService="+ballotService);

    if (bindingResult.hasErrors()) {
        log.trace("   ballot is invalid: "+bindingResult.getAllErrors());
        throw new BindException(bindingResult);  // this generates a cool error message. But it should be documented :-)
    }

    return newBallot;
}

HTTP 応答

{
  "timestamp": "Sep 20, 2016 11:57:07 AM",
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.validation.BindException",
  "errors": [
    {
      "field": "voteOrder",
      "bindingFailure": false,
      "objectName": "ballotModel",
      "codes": [
        "NotNull.ballotModel.voteOrder",
        "NotNull.voteOrder",
        "NotNull"
      ],
      "arguments": [
        {
          "codes": [
            "ballotModel.voteOrder",
            "voteOrder"
          ],
          "defaultMessage": "voteOrder"
        }
      ],
      "defaultMessage": "may not be null"
    }
  ],
  "message": "Validation failed for object='ballotModel'. Error count: 1",
  "path": "/ballot"
}
于 2016-09-20T10:03:17.323 に答える