2017-12-14 5 views
0

上の異なる層の検証アノテーション複数のレイヤーに対するリクエスト(REST、サービス、永続性)を表します。スプリング(ブート)<em>スプリングブート</em>、<em>スプリング</em> MVCと<em>春データ</em>一クラス(<em>MongoDBのデータベースとして</em>で)に使用したWebアプリケーションを考えると同じクラス

いくつかのレイヤーにのみ適用される(または一部によって無視される)ように、クラスのフィールドに検証制約を指定することは可能ですか?

例:

エンティティ@NotEmptyが注釈

RESTのAPI層

JSR 303 ある(ゲッターとセッター自動生成)

public class User { 

    private String name; 

    @NotEmpty 
    private String role; 
} 

roleサービス層

roleが実装によって設定され、repo春データMongoRepositoryで永続化層

@Service 
public class UserService { 

    @Autowired 
    private UserRepo repo; 

    private User createAppUser(User u) { 
     u.setRole("APP_USER"); 
     return repo.save(u); 
    } 
} 

によって必要とされる

@RestController 
public class RegisterController { 

    @Autowired 
    private UserService service; 

    @PostMapping 
    public User register(@Valid User u) { 
     return service.createAppUser(u); 
    } 
} 

ここに存在していません。

私はこの問題を解決する二つのアプローチを考えることができます:RESTのAPI層

  • マニュアル/手続きの検証のためのDTOオブジェクトを導入

    1. 。彼らは定型の多くを必要とし、これは些細な場合のように、私はあまり好きではありませんどちらも、宣言だけでは何も

    を - Validatorまたは何か他のものを使用して、問題ではないありませんか。

  • +2

    使用の検証グループ。グループに適用する注釈を指定し、異なるレベルでは検証するグループを指定します。 –

    答えて

    2

    検証グループと@Validatedアノテーションを使用できます。このような

    エンティティ

    @NotEmpty(groups = Create.class) 
    

    方法

    public User register(@Validated(Create.class) User u) { 
        return service.createAppUser(u); 
    } 
    
    関連する問題