下面是我按照一般的經驗法則:
當使用Bean驗證,指定不要求其它的bean依賴 規則。在另一個bean依賴 的那一刻,請讓您的服務 圖層處理該依賴關係。
換句話說,如果您在另一個bean中引用了一個bean,請避免放入該@NotNull約束。您的服務層最適合用於此目的,因爲您可以更早地捕獲違規行爲,並且更符合邏輯(因爲其他業務驗證會假定bean可用)。
作爲一個例子,考慮下面的實體(道歉它不會編譯)
@Entity
public class User
{
@Id
private int id;
@NotNull
private String fullName;
@NotNull
private String email;
private Set<Role> roles; //No bean validation constraints here.
...
public boolean mapRoleToUser(Role role)
{ //Validation is done here. Including checks for a null role.
}
}
@Entity
public class Role
{
@Id
private int id;
@NotNull
private String name;
}
在這種情況下的服務層,是應該驗證用戶是否具有附接或不作用的一個。在預先存儲或預更新階段進行驗證有點太晚了,特別是當存在具有業務邏輯的獨特服務層時,以及領域模型中的其餘業務邏輯(可悲的是,我還沒有看到單獨使用領域模型中的所有邏輯就足夠好了)。