2016-09-20 5 views
0

Spring Boot 1.4とSpringデータRest/MVCの使用@Valid @RequestBodyが動作しなくなりました。私は、複数のバージョンのHibernate Validatorを試して、Validtor Beanなどを宣言しました。Spring Hibernate Validation @RequestBody

@BasePathAwareController 
@RestController 
public class TestRestController extends BaseController { 
    @PostMapping("/pojo/save") 
    public @ResponseBody ResponseEntity<?> upload(@Valid @RequestBody MyPojo pojo) { 
    // Code here calling a repository.save. 
} 

はMyPojoはrepostiory.saveメソッドが呼び出されたが、春はPOJO上の任意の検証を試みていないときに、私は実際にバリデータの例外を参照してくださいつまり@Digits、@NotNull、など様々な検証アノテーションを含みます。ここで

は春の依存関係を含め、私のPOMのセクションです:

 <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
      <exclusions> 
       <exclusion> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jdbc</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 

任意のアイデアをいただければ幸いです。私は検索のトンをやったことがあり、運がないと多くの異なる構成を試してみました。

更新

データベースにエンティティを保存しようとすると検証エラーが発生した場合、それはです。私は、次のエラーが表示されます

@Valid注釈を使用して
Caused by: javax.persistence.RollbackException: Error while committing the transaction 
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='numeric value out of bounds (<9 digits>.<3 digits> expected)... 
+0

フロントエンドでSpringフォームを使用している場合は '@ RequestAttribute'に変更します。可能であればフロントエンドコードを表示します –

+0

これはRESTエンドポイントなので、 Postman Clientを使用して本文内のJSONオブジェクトでPOSTを実行します。 – tlavarea

+0

[this](http://blog.codeleak.pl/2013/09/request-body-validation-in-spring-mvc-3.2.html)と[このリンク](https://dzone.com/articles)/spring-31-valid-requestbody)あなたを助けるかもしれない –

答えて

0

あなたが右の検証POJO後BindingResultパラメータを宣言する必要があります。 BindingResultにはすべての検証エラーが含まれていて、必要な処理は自由に実行できます。

+1

その他のコンテキスト:[入門 - フォーム入力の検証](https://spring.io/guides/gs/validating-form-input/)はじめにフォームの検証について話しますが、JSONリクエストに基づいて独自のカスタムレスポンスを行うこともできます。 –

+0

ありがとうございます。私は運がなくてもそれを試しました。 BindingResultには常にゼロのエラーが含まれます。また、@ContainerAdviceクラスを作成して、MethodArgumentNotValidExceptionおよびConstraintViolationExceptionをグローバルに処理しようとしましたが、それもうまくいきませんでした。 – tlavarea

+0

@RequestBodyアノテーションをパラメータから削除し、クラスパスにjavax.validationの実装があることを確認してください。 hibernateバリデーター。 そして、どこにBindingResultを配置しましたか? (@Valid MyPojo pojo、BindingResult errors、@Valid MyAnotherPojo anotherPojo、BindingResult anotherErrors) ' –

0

@BasePathAwareControllerは、バインディングの検証を実行しない原因となっています。これが意図された動作かバグかどうかはわかりませんが、コントローラからその注釈を削除すると、検証は期待通りに実行されます。

関連する問題