2017-12-20 14 views
0

私はHibernate Validator APIを使用してオブジェクトのフィールドを検証しています。見た目の例は以下の通りです。JSR 303は制約違反で例外をスローします

@NotNull @Size(min = 3, max = 8) String name; 
@NotNull @Size(min = 3, max = 16) String surname; 
@Size(min = 3, max = 10) String company; 
// ... 

ここでの問題は、オブジェクトを構築できて例外がスローされないことです。例えば。

Person p = new Person("a", "b", "c"); 

これは実行時の例外をスローせず、違反した制約を持つオブジェクトを作成します。違反した制約を取得するには、Validatorインスタンスをクライアントコードから明示的に呼び出す必要があります。どうしてそういうのか分かりませんが、オブジェクトのフィールドが違反した場合には何らかの例外で失敗するオブジェクトの構築が必要です。そのようなもの:

Person p = new Person("a", "b", "c"); 

...例外をスローします。そして、無効なオブジェクトを作成できませんでした。これは私が望む行動です。

これは可能ですか?

答えて

0

オブジェクトを作成するときにctorの値をチェックするだけではどうですか?

public Person(String name, String surname, String company) { 
    if(name == null || name.length() < 3) { 
     throw new IllegalArgumentException("useful message") 
    } 
} 

しかし、これらの注釈は、オブジェクトをDBに保存するときにのみ機能すると仮定します。

+0

あなたは私の要件を説明しようとしている単なる基本的な例ですか?実際のオブジェクトには30個のフィールドがあり、ビルダーパターンなどを使用するので、あなたのようなものは不可能です。私が言ったように、私は制約が違反された場合に失敗する工事を必要とします – wesleyy

0

Hibernate Validatorは妥当性検証を実行するためにあなたのコンストラクタを魔法のように傍受することはできません。

だから、何かする必要があります。

クラスをインスツルメントする(ByteBuddyなどで)ことができますが、それをお勧めしますか?

最も簡単な方法は、オブジェクトをインスタンス化してサービスを検証するサービスなどを作成することです。

+0

オブジェクトをインスタンス化し、サービス(またはsth同様)内でそれを検証する問題は、私のオブジェクトがビルダーで作成されることです。唯一の方法は、ビルドメソッドの中で正しいと思わない検証をすることでしょうか?また、私が使っているAutoValue.Builderを使っているときに実装するのはかなり難しいかもしれませんが(おそらく可能です) – wesleyy

+0

ByteBuddyでクラスをインスツルメントすることができます。しかし、それはもっと簡単になるだろうか分からない。 –

関連する問題