2012-01-30 14 views
9

をオーバーライドすることができ、私は以下のような試験を有する
[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]私は、JSR-303の検証注釈を

しかし、私は、注釈が@Sizeオーバーライドすることが期待できます、警告は表示されません。
これを達成する方法はありますか?

編集:私はbugがそれに関連しているようだが、私は4.2.0の最終を実行し、依然として上記の動作を得る。

答えて

12

JSR-303では、検証注釈のオーバーライドは実際にはサポートされていません。代わりに、サブクラスでオーバーライドされたメソッドの注釈は累積を適用されます。仕様のセクション3.3から:

 
A constraint declaration can be placed on an interface. For a given class, 
constraint declarations held on super- classes as well as interfaces are 
evaluated by the Bean Validation provider. Rules are formally described in 
Section 3.4.5. 

The effect of constraint declarations is cumulative. Constraints declared 
on a superclass getter will be validated along with any constraints defined 
on an overridden version of the getter according to the Java Language 
Specification visibility rules. 
3

は、XMLコンフィギュレーションを経由して、注釈に構成検証ovverideすることができます:あなたは別の検証(または検証なし)を宣言した場合validation.xmlにGETLIST()methidのために、あなたのケースで

http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html_single/#validator-xmlconfiguration

をファイルの場合は、@Sizeアノテーションを上書きします。

+0

なし、私は、デフォルトのバリデータを使用したいが、注釈をオーバーライドします。 – oshai

+0

申し訳ありませんが、あなたは何を意味するか分かります。私は私の答えを編集しました。 –

+0

ありがとう、そこにコードで行う方法はありますか? – oshai

1

レコードだけのために、私は私の問題のためのバイパスを発見した:

public class TestSizeAnnotation 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("c " + 
       Validation.buildDefaultValidatorFactory().getValidator().validate(new C(), Default.class, SizeGroup2.class)); 
     System.out.println("p " + 
       Validation.buildDefaultValidatorFactory().getValidator().validate(new P(), Default.class, SizeGroup.class)); 
    } 
    public static interface SizeGroup {} 
    public static interface SizeGroup2 {} 
    public static class P 
    { 
     private List<String> lst = newArrayList("AA"); 
     @Size(max=0, message="P" , groups=SizeGroup.class) 
     public List<String> getLst() 
     { 
      return lst; 
     } 
     public void setLst(List<String> lst) 
     { 
      this.lst = lst; 
     } 
    } 
    public static class C extends P 
    { 
     @Override 
     @Size(max=5, message="C", groups=SizeGroup2.class) 
     public List<String> getLst() 
     { 
      return super.getLst(); 
     } 

    } 
} 
+1

これはオーバーライドではなく、累積的です。この場合、2番目の検証が合格した場合、最初の検証は常に成功しますが、たとえば、最初の検証がMin(...)の場合は、Max(...)をオーバーライドするメソッドに追加すると、 MinとMaxの両方の検証を使用します(Maxは最初のMinを上書きしません)。 –

関連する問題