【问题标题】:adding validation to my save method向我的保存方法添加验证
【发布时间】:2017-04-04 20:35:14
【问题描述】:

在我的 xpages 应用程序中,我想通过托管 bean 中的保存方法保存文档。但是我不知道如何在此保存方法中包含验证规则并将消息发送回 XPage。我尝试了几个我在谷歌上找到的例子,但没有一个有效。也许有人可以阐明我如何在不设置单独的验证 bean 的情况下添加简单的服务器端验证?

这是我到目前为止提出的:

public void save(Employee employee) throws ValidatorException {

        try {

            Document doc;           openDBPlusView();

            if (employee.getUnid() != null) {
                doc = view.getDocumentByKey(employee.getUnid(), true);
            } else {
                doc = null;
            }
            if (doc == null) {
                doc = db.createDocument();
            }
            if (employee.getEmail().equals("")) {
                FacesMessage message = new FacesMessage();
                message.setDetail("Email missing");
                throw new ValidatorException(message);
            } else {
                doc.replaceItemValue("email", employee.getEmail());
            }
            doc.replaceItemValue("Form", "employee");
            doc.save(true, false);          
            recycleNotesObjects();
        } catch (NotesException e) {

            e.printStackTrace();
        }
    }

【问题讨论】:

  • 你目前的结果和预期的结果是什么?

标签: java xpages


【解决方案1】:

试试这个示例,它应该可以解决您的问题:

员工(您的数据对象):

package com.test.data;

public class Employee {

    private String email;

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

}

FormBean(用于在 Notes 后端保存数据的 bean):

package com.test.bean;

import java.io.Serializable;

import com.test.data.Employee;

public class FormBean implements Serializable {

    private static final long serialVersionUID = -1042911106119057617L;

    public void save(Employee employee) {

        System.out.println("Keep in  mind: Save will only be entered if no validation errors! JSF Lifecycle!");
        System.out.println(employee.getEmail());

    }

}

FormValidators(用于验证的 bean,在您的示例中为电子邮件地址):

package com.test.validation;

import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

public class FormValidators implements Serializable {

   private static final long serialVersionUID = 7157377379640149444L;

   public void validateEmail(FacesContext facesContext, UIComponent component, Object value) {
      // Check if email is valid or not
      if (value.toString().equals("") || value.toString().indexOf('@') == -1) {
         // Create a message -> email is invalid
         FacesMessage message = new FacesMessage("Email is invalid!");
         // Throw an exception so that it prevents document from being saved
         throw new ValidatorException(message);
      }
   }

}

面孔配置:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
  <managed-bean>
    <managed-bean-name>formBean</managed-bean-name>
    <managed-bean-class>com.test.bean.FormBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
  </managed-bean>
  <managed-bean>
    <managed-bean-name>formValidators</managed-bean-name>
    <managed-bean-class>com.test.validation.FormValidators</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
  </managed-bean>
  <!--AUTOGEN-START-BUILDER: Automatically generated by IBM Domino Designer. Do not modify.-->
  <!--AUTOGEN-END-BUILDER: End of automatically generated section-->
</faces-config>

XPage(用于测试您的需求/将所有内容放在一起):

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">


    <xp:br></xp:br>
    <xp:br></xp:br>

    <xp:messages id="messages1"></xp:messages>

    <xp:br></xp:br>
    <xp:br></xp:br>

    <xp:inputText id="txtEmail" validator="#{formValidators.validateEmail}" value="#{requestScope.email}"
        required="true">
    </xp:inputText>

    <xp:br></xp:br>
    <xp:br></xp:br>

    <xp:button id="btnSave" value="Save">
        <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript:var employee:com.test.data.Employee = new com.test.data.Employee();
employee.setEmail(requestScope.email);
formBean.save(employee);}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>

</xp:view>

记住:只有在没有验证错误的情况下才会输入保存。 JSF 生命周期!

【讨论】:

  • 你好 Georg,我已经实现了你的代码,但是我根本没有看到 FormValidators 类 bean (System.out.println(this.getClass().getSimpleName().toString() in类的公共构造函数)很遗憾我无法让它工作。你能提供一个更有效的示例(nsf)来演示代码吗?
  • FormValidators 类是一个托管 bean,托管 bean 在第一次访问时由托管 bean 创建工具“启动”。但是这个例子应该有效。将上述所有代码 sn-ps 复制到一个空数据库中进行编译并在浏览器中打开 xpage。但是,如果您有任何问题,请不要犹豫再次与我联系...
  • 嗨,Georg,感谢您帮助我。问题在于,当我提交一个空字段时,验证器 bean 不会启动。当我提交一个非空字段时,验证器就会启动。你知道这可能是什么原因吗?
  • 您的电子邮件字段不是必填字段吗?您是否将电子邮件 xp:inputtext 设置为 required=false?
  • 从以下 Q 中了解到,无法使用验证器(我正在测试)对空字段进行验证,并且有一种解决方法(我尚未测试)@987654321 @ .所以现在我知道如何验证非空字段,但我仍然不知道如何将消息返回到自定义消息框中。
【解决方案2】:

我过去所做的是让该方法将布尔值返回到我的保存按钮,如果保存未完成,则返回 false。然后在保存按钮 SSJS 代码中,我调用 bean 以获取要在 displayerror(或错误)控件中显示的消息。我不确定 validatorException 在自定义验证器之外是否有效。

另一个选项是验证您的输入文本,除非各种控件通过验证,否则不要保存。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多