私はまだ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 をキャッチするにはどうすればよいですか?