【问题标题】:JSF 2 reusing the validation defined in the JPA entities?JSF 2 重用 JPA 实体中定义的验证?
【发布时间】:2011-07-19 10:37:34
【问题描述】:

让我们从一个例子开始:


在我的 JPA 实体中

public class User {
    @Pattern("^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$", message="invalidEmailResourceBundleKey")
    private String email;

    @Min(5, message="minimumResourceBundleKey")
    private int age;

...
}

在我的 JSF Bean 中

public class UserBean {
    private User user;

    // do i have to redefine it here, since it's already a part of the user ?
    @@Pattern("^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$") 
    public String getEmail() {
        return user.getEmail();
    }
    public void setEmail(String s) {
        user.setEmail(s);
    }

    // do i have to redefine it here, since it's already a part of the user ?
    @Min(5, message="minimumResourceBundleKey")
    public int getAge() {
        return user.getAge();
    }
    public void setAge(int age) {
        user.setAge(age);
    }
}

是否可以重用 JSF bean 的实体验证,实际上将方法调用委托给实体,这样我就不必重新定义 JSF bean 上的 bean 验证?

我什至可以将重用扩展到资源包中的错误消息级别,以及是否可以像往常一样使用 {0} 等参数化消息?我想知道网络上是否有任何示例,因为我一直找不到。

请分享您对此的看法..

谢谢!

【问题讨论】:

    标签: jsf jpa jsf-2 jpa-2.0 bean-validation


    【解决方案1】:

    如果您没有不必要地扁平化 bean 属性,则无需重新定义它们。只需使用getUser()

    public class UserManager {
    
        private User user;
    
        public User getUser() {
            return user;
        }
    
    }
    

    并直接绑定到JPA实体的属性。

    <h:inputText value="#{userManager.user.email}" />
    <h:inputText value="#{userManager.user.age}" />
    

    与具体问题无关,您的电子邮件正则表达式对于去年推出的国际化域名 (IDN) 将失败。我会修复正则表达式,使其不仅接受拉丁字符。有关示例,另请参阅 this answer

    【讨论】:

    • 哇!如此简单优雅!哈哈。谢谢BalusC。您能否也分享您对错误资源的看法。如果我能以某种方式参数化错误资源,那就太好了。带有 message 属性的 Bean Validation 是否支持它?并且参数本身可以i18ned吗?
    • 不客气。抱歉,这是一个不同的问题,值得单独讨论。
    猜你喜欢
    • 2011-03-20
    • 2013-06-05
    • 1970-01-01
    • 2011-09-07
    • 2013-02-10
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多