【问题标题】:Edit row and validate编辑行并验证
【发布时间】:2013-06-29 15:23:02
【问题描述】:

我想在数据表中编辑我的行,但我遇到了问题。我有一个验证器,它检查数据库中是否有社会安全号码。当我添加一切正常。我在编辑时会出现问题。 以下是我的编辑页面中的代码片段:

<h:form>
    <div id="userPanel">
        <p:panel id="panelUser" header="Edytuj administratora" >
            <div id="panelImage">
                <img src="./../../images/person4.png" alt="person" width="150px" height="130px"/>
            </div>
            <h:inputHidden value="#{userMB.user.id}" />
            <h:panelGrid columns="3">
                <p:outputLabel for="firstName" value="#{msg.firstName}"></p:outputLabel>
                <p:inputText id="firstName" value="#{userMB.user.firstName}" label="#{msg.firstName}" required="true">
                    <f:validator validatorId="firstNameValidator" />  
                    <p:ajax update="msgFristName" event="keyup" />  
                </p:inputText>  
                <p:message for="firstName" id="msgFristName"/> 

                <p:outputLabel for="lastName" value="#{msg.lastName}"></p:outputLabel>
                <p:inputText id="lastName" value="#{userMB.user.lastName}" label="#{msg.lastName}" required="true">
                    <f:validator validatorId="lastNameValidator" />   
                    <p:ajax update="msgLastName" event="keyup" /> 
                </p:inputText>  
                <p:message for="lastName" id="msgLastName"/> 

                <p:outputLabel for="personalId" value="#{msg.personalId}"></p:outputLabel>
                <p:inputText id="personalId" value="#{userMB.user.personalId}" label="#{msg.personalId}" required="true">
                    <f:validator binding="#{personalIdValidator}" />   
                    <p:ajax update="msgPersonalId" event="keyup" /> 
                </p:inputText>  
                <p:message for="personalId" id="msgPersonalId"/>

                <p:outputLabel for="password" value="#{msg.password}"></p:outputLabel>
                <p:inputText id="password" value="#{userMB.user.password}" label="#{msg.password}" required="true">
                    <f:validator validatorId="passwordValidator" />   
                    <f:attribute name="confirmPassword" value="#{confirmPassword}" />
                    <p:ajax update="msgPassword" event="keyup" /> 
                </p:inputText>  
                <p:message for="password" id="msgPassword"/>

                <p:outputLabel for="confirmPassword" value="#{msg.confirmPassword}"></p:outputLabel>
                <p:inputText id="confirmPassword" binding="#{confirmPassword}" label="#{msg.confirmPassword}" required="true">
                    <f:validator validatorId="passwordValidator" />   
                    <f:attribute name="confirmPassword" value="#{confirmPassword}" />
                    <p:ajax update="msgConfirmPassword" event="keyup" /> 
                </p:inputText>  
                <p:message for="confirmPassword" id="msgConfirmPassword"/>
            </h:panelGrid>
            <center><p:commandButton value="#{msg.edit}" action="#{userMB.editUser()}" ajax="false">
                    <f:param name="userRole" value="admin" />
                    <f:param name="active" value="true" />
                </p:commandButton>
                <p:commandButton value="#{msg.cancel}" action="#{userMB.cancel()}" ajax="false" immediate="true"/></center>
        </p:panel>
    </div>
</h:form>

当我想编辑用户时,我点击按钮:

<center><p:commandButton value="#{msg.edit}" action="#{userMB.editUser()}" ajax="false">

调用方法editUser:

public String editUser() {
    FacesContext context = FacesContext.getCurrentInstance();
    Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap();
    try {
        String userRole = requestParameterMap.get("userRole").toString();
        String active = requestParameterMap.get("active").toString();
        Boolean act = Boolean.parseBoolean(active);
        user.setRole(userRole);
        user.setActive(act);
        if ((user.getEmail() != null) && (userDao.findEmailExist(user.getEmail()))) {
            sendErrorMessageToUser("Użytkownik z podanym adresem email istnieje w bazie");
            return null;
        } else if ((user.getPersonalId() != null) && (userDao.findPersonalIdExist(user.getPersonalId()))) {
            sendErrorMessageToUser("Użytkownik z podanym numerem pesel istnieje w bazie");
            return null;
        } else if ((user.getPhone() != null) && (userDao.findPhoneExist(user.getPhone()))) {
            sendErrorMessageToUser("Użytkownik z podanym numerem telefonu istnieje w bazie");
            return null;
        } else {
            userDao.update(user);
        }
    } catch (EJBException e) {
        sendErrorMessageToUser("Błąd edycji użytkownika w bazie");
        return null;
    }
    sendInfoMessageToUser("Konto zedytowane");
    return user.getRole() + "List";
}

方法find personalIdExist在找到编辑过程中给出的personalId时返回true,如果没有找到返回false。

这是我的问题。当我编辑User 时,我的编辑页面如下所示: 示例:

名字:巴勃罗

姓氏:ABCD

个人ID:12345678901

密码:zxcv

当我编辑个人 ID 时,一切正常,但我只能编辑 firstNamelastNamepassword,而不能编辑 personalIdPersonalId 可能是一样的。当我单击编辑时,我遇到了问题,因为如果 id 已经存在并且我无法更新我的用户,我的方法 personalIdExist 返回 true。 我需要在某个地方保存该用户的初始值personalId,以便能够对其进行编辑。但是不知道怎么弄。

【问题讨论】:

    标签: java validation jsf ejb


    【解决方案1】:

    据我了解,检查数据库中是否有重复的 id 是持久层的一部分,你不应该尝试在验证器中验证它。

    使用验证器检查更正式的问题(数据格式、所需数据缺失等)。 id重复的问题应该由业务逻辑控制或委托给持久层;没有问题,因为您将知道该操作是添加新用户还是修改现有用户。

    如果您坚持为此使用验证器,请为每个问题创建一个特定的验证器(更新personal 或创建personal

    更新:我想我明白你想要什么了。您希望在将每个字符添加到 id 之后,根据数据库验证它是否已经存在,并且如果它已经存在则显示一条消息,不是吗?但有时该检查应该是一个错误(因为它引入了重复),而在其他情况下它不应该是一个错误(因为它正在查找一个数字)。我说的对吗?

    在这种情况下,我会说你有两种不同的用法,你应该使用两种不同的属性(newPersonalIdeditedPersonalId),而不是试图混合使用它们。

    另一种方法是在您的 bean 中创建一个 exists 布尔属性;设置personalId 将导致查找继续进行,如果已经在数据库中,exists 属性将设置为 true。在 XHTML 中,一些元素将基于此呈现/禁用;但这对我来说太复杂了。

    UPDATE2:我还是不明白,如果用户已经存在,您正在积极阻止更新数据库,使用此代码

        } else if ((user.getPersonalId() != null) && (userDao.findPersonalIdExist(user.getPersonalId()))) {
            sendErrorMessageToUser("Użytkownik z podanym numerem pesel istnieje w bazie");
            return null;
    

    持久层很简单,只要记住在这个阶段user是一个分离的实体所以你需要使用EntityManager.merge方法。

    【讨论】:

    • 好的,谢谢。我将其移至商业逻辑。但这并不能解决我编辑personalId的问题。我需要在某个地方保存初始值 personalId 以排除它以检查数据库中的代表。
    • 但是(除非我不明白你的爸爸会用 &lt;p:commandButton&gt; 或类似的调用动作方法来完成。调用不同的动作来编辑现有行或保存新行。否则,我需要更多命令组件的上下文和您的操作方法来提供更多建议。
    • 我认为他遇到的问题是,当他尝试更新除个人 ID 之外的任何内容时,它会给他一个错误。
    • 附加提示:如果您进行编辑,请不要让您的 id 字段可编辑。那只会带来麻烦。将其隐藏,如果您觉得最终用户应该看到它,请将其打印在某处(但保留隐藏字段)
    【解决方案2】:

    这是我对您的问题的解释。

    当您通过更改个人 ID 以外的所有内容来编辑用户时,您会收到错误

    SJuan76 方法是正确的方法。你不想让验证器为你做那个检查。相反,只需专注于确保用户像您期望的那样输入 personlId 的值。然后,让持久层为您强制执行唯一性(无需编写自己的逻辑)。我假设您使用的是 ORM(但我不确定是哪一个),所以您的 UserMB 应该看起来像这样(伪代码,因为我正在脑海中写下)。

    public class UserMB {
    
        private Long personalId; //Not sure what your actual type is 
    
        @Column(unique = true)//Uniqueness constraint
        public Long getPersonalId() { 
            return personalId; 
        }
    
        //Remainder omitted
    }
    

    如果您使用的是普通 SQL 或某些变体,请确保在创建表时为您的 personalId 列声明唯一性约束。在这两种情况下,当您尝试更新您的 UserMB personalId 并且其他人已经拥有它时,将引发异常。只需捕获它并将其作为错误消息返回。

    通过此更改,您的代码中将不再需要以下方法

    findPersonalIdExist(user.getPersonalId())
    

    (顺便说一句,这是您问题的根本原因)如果您尝试更新firstNamelastName 而不更改personalId,一切都会顺利进行。如果您尝试编辑您的personal id 而其他人已经拥有它,那么将不允许更新。

    评论

    这与您的具体问题无关,但我有点担心您的逻辑。您已经拥有下面的用户 ID(我猜这是您的 ORM 管理的用户 ID)。

    <h:inputHidden value="#{userMB.user.id}" />
    

    因此,您不应尝试通过将值作为参数传递来查找列(例如 phoneNumber)是否存在。您应该直接根据数据库中唯一的id 获取用户instance,并验证他是否只是重新输入相同的信息。你可能会遇到问题。这是一个场景:

    userA 想要将电话号码从 123 更改为 345

    userB 已有电话号码 345

    即使用户 A 没有输入相同的值,您的代码也会返回 true(除非这是您想要的)。如果您确实希望每个人的字段具有唯一值,只需在需要的地方添加unique="true"。不需要所有这些检查。

    您还可以通过提供自己的转换器或在faces-config 中设置一些参数来消除所有null 检查,以便将所有提交的空字符串解释为null。请看下面的链接

    h:inputText which is bound to String property is submitting empty string instead of null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-30
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2010-11-12
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多