2011-08-18 91 views
6

我怎么能去在下列情况下重写验证上的电子邮件为AuthorizedUser:JSR 303的验证覆盖

public class Account { 
    @Length(min = 1, max = 100, 
      message = "'Email' must be between 1 and 100 characters in length.") 
    @NotNull(message = "'Email' must not be empty.") 
    protected String email; 

    @Length(min = 1, max = 50, 
      message = "'Name' must be between 1 and 50 characters in length.") 
    private String name; 
} 

public class AuthorizedUser extends Account { 
    @Length(min = 1, max = 40, 
      message = "'Field' must be between 1 and 50 characters in length.") 
    private String field; 
} 

我知道由二传手覆盖的电子邮件地址,我可以“砍”的解决方案对通过执行AuthorizedUser如下:

@Override 
public void setEmail(String email) { 
    this.email = email; 
    super.setEmail(" "); 
} 

我就觉得肮脏...这是可能的,而无需编写自定义验证程序被重写?

我试着将@Valid移动到超类的setter中,并将它放在覆盖的字段中,但仍然收到超类中关于它为空的消息。有没有更懒惰的方法来做到这一点?

+0

到目前为止,我结束了编写自定义验证,在我简单的例子下面的情况下工作,但在更复杂的模型中,我认为需要制作更多的课程是没有意义的。 – Scott

回答

3

由于约束是通过继承聚集,最好的解决办法可能是你的继承层次改变这样的事情:

public class BasicAccount { 
    protected String email; 

    @Length(min = 1, max = 50, 
      message = "'Name' must be between 1 and 50 characters in length.") 
    private String name; 
} 

public class EmailValidatedAccount extends BasicAccount { 
    @Length(min = 1, max = 100, 
      message = "'Email' must be between 1 and 100 characters in length.") 
    @NotNull(message = "'Email' must not be empty.") 
    @Override 
    public String getEmail() { 
    return email; 
    } 
} 

public class AuthorizedUser extends BasicAccount { 
    @Length(min = 1, max = 40, 
      message = "'Field' must be between 1 and 50 characters in length.") 
    private String field; 
}