2014-02-17 78 views
3

我很難相信我是唯一一個想要這樣做的人,但我找不到任何引用來幫助我完成我的障礙。使用Spring MVC和基於標註的驗證(我使用的框架4.0和Java 1.7),考慮一個簡單的類層次結構,如下所示:繼承類的Spring MVC驗證

abstract class Foo { 

    @Size(max=10, message = "The name has to be 10 characters or less.") 
    private String name; 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

class Bar extends Foo { 

} 

class Bang extends Foo { 

} 

如果我在柱狀圖或實例把砰,這是大於10個字符,我得到我期待的驗證錯誤。不過,假設我仍然希望Bar和Bang來自抽象基類Foo,但我希望子類的名稱屬性具有不同的驗證。

如何詮釋酒吧和Bang使Bar.name有,比方說一個最大長度爲12個字符而Bang.name有8個字符的最大長度?

謝謝了, 羅布

+0

[相似酮](http://stackoverflow.com/questions/9067420/can-i-override-a-jsr-303-validation-annotation) – gadget

+0

我看到。我在基類上使用NO驗證對重寫的getter方法嘗試了「累積」的事情。會發生什麼是驗證不會發生。我嘗試過在各個地方胡鬧@Valid,我仍然無法讓驗證者在重寫的getter上開火。 是否必須在基類上設置'@Size'驗證程序,然後在擴展類上進一步限制它?像基類上的max = 1000,然後擴展上的max = 12,以利用註釋驗證的「累積」性質? – RobAllen

+0

重點在於,由於這種累積性質,JSR303註釋不可能覆蓋。 – gadget

回答

1

創建派生類的新領域和覆蓋的方法。

class Bar extends Foo { 
    @Size(max=12, message = "The name has to be 12 characters or less.") 
    private String name; 

    @Override 
    public String getName() { 
     return this.name; 
    } 

    @Override 
    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

謝謝,但沒有那種打敗抽象基類的目的? – RobAllen

+0

如果你只使用抽象類來保存'name'字段,是的。如果抽象類包含其他常見字段,方法等,則可能值得。 –

+0

我明白你的觀點。從我過度簡化的「Foo Bar Bang」例子中走出來,它基本上是一個抽象的Person類,它擁有更多特定類型人員可以擴展的所有常見屬性。 – RobAllen

1

你也可以把@Size(max=12, message = "The name has to be 12 characters or less.")標註在getter方法上。

因此,只需重寫名稱字段並將您的個性化註釋放在getter方法上即可。 它將與將驗證註釋放在字段上相同。見下面的例子:

class Bar extends Foo 
{ 
    @Override 
    @Size(max=12, message = "The name has to be 12 characters or less.") 
    public void getName(String name) 
     { 
      this.name = name; 
     } 
}