4

私はまだSpring全般に不慣れで、Springブートを使用しようとしています。(できれば)簡単な質問があります。JSON を返す ReSTful サービスを構築しようとしています。Building a RESTful Web Service Guideに従っていますが、JSON を正常に返すことができます。データがデータベースによって支えられるように、JPA を Web サービスに統合しました。

ここで、ユーザーがオブジェクトを作成できるルートを作成する必要があり、オブジェクトを検証したいと考えています。Validation Form Input Guideに従っていますが、Web コンテンツを提供するサービスを実際に作成しようとしているわけではありません。私が望むのは、検証エラーが発生するたびに、独自のカスタム JSON を返すことです。これまでのところ、これを実現するためのリソースを見つけることができませんでしたが、Petri の Sweet Rest API Guideに従ってみましたが、これは何度も役に立ちましたが、このシナリオではうまく機能していないようです。私はhibernate-validator:5.0.1.Final以下のために使用して休止状態にしています。

@Entity
@Table(name = "PEOPLE")
public class Person{

    @Id
    @Column(unique = true)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Min(18)
    private long age;
    private String name;

    //Necessary for JPA
    protected Person() {}

    public Person(long age, String name) {
        this.age = age;
        this.name = name;
    }

    // Getters Omitted
}

次に、私の PersonController:

@Controller
public class PersonController {

    @RequestMapping(value="person/", method=RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Person> create(@Valid @RequestBody Person person) {
        // Create in DB and return
    }
} 

これは、ガベージ JSON をこのルートに送信すると 400 が返されるという点で、最も厳密な方法で機能します。しかし、応答の本文は HTML ページであり、あまり良くありません。それで、私の質問は、検証エラーをキャッチする方法はありますか? コントローラーに以下を追加しようとしましたが、成功しませんでした:

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleError(MethodArgumentNotValidException ex) {
    //generate my own error message
    return new ResponseEntity(customErrorClass, HttpStatus.BAD_GATEWAY);
}

Bad Gateway が有効な戻りコードではないことは承知していますが、例外ハンドラーが呼び出されないことを証明するためだけに使用しました。Rest サービスに POST すると、まだ 400 Bad Request + HTML が表示されます。オーバーライドできる賢明なデフォルトがあると思いますが、それがどこにあるのかわかりません。グーグルで検索してstackoverflowを検索してみましたが、うまくいきませんでした。

前もって感謝します。

アップデート

BindingResultメソッド シグネチャに a を含めるように Controller を変更すると、次のようになります。

@Controller
public class PersonController {

    @RequestMapping(value="person/", method=RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Person> create(@Valid @RequestBody Person person, BindingResult bindingResult) {
        if(bindingResult.hasErrors()){
            //handle errors and return
        } else {
        // Create in DB and return
        }
    }
} 

私はそれを働かせることができます。( jasper-el jar も依存関係に追加する必要があったことに注意してください) 以前にこれを試して動作しませんでしたが、その理由は直感的ではありません。私は次の JSON で投稿していました: JSON Spec{ "id" : "foo", "age": 22, "name" : "James Bond" }に よると、これは有効な JSON です。明らかに、私の Person モデルは String "foo" を long にキャストできません。エラーが 400 であるべきかどうかについては触れませんが、私の新しい質問は次のとおりです。この 400 をキャッチするにはどうすればよいですか?

4

2 に答える 2

4

不正な形式または変換不可能な JSON を処理するには、HttpMessageNotReadableExceptionクラスをキャッチできます

@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity handleBadInput(HttpMessageNotReadableException ex) {
   Throwable cause = ex.getCause();
于 2013-12-20T19:01:27.413 に答える