【问题标题】:Why does Input is holding value after required field validation为什么输入在必填字段验证后保持值
【发布时间】:2012-12-09 20:10:18
【问题描述】:

当页面加载了绑定到视图范围内支持 bean 中的值的输入时,如果该值已预先初始化,则在必填字段验证后,输入再次填充以前的值。

这是托管 bean:

@ManagedBean(name = "adminController")
@ViewScoped
public class AdminController extends BaseWebController implements Serializable {

    private static final long serialVersionUID = 1019716974557397635L;

    private transient CustomerDTO customerDTO;          

    public AdminController() {
        log.debug("Inside AdminController");
    }

    @PostConstruct
    public void init() {
        initCustomerDTO();
        customerDTO.setCustomerName("Test");
    }

    public void saveCustomer(ActionEvent event) {
        try {
            getServiceProvider().getCustomerService().addNewCustomer(customerDTO);
            getFacesContext().addMessage(null, FacesMessageUtils.getMessageForCustomerSaveSuccess(getFacesContext()));
        } catch (Throwable throwable) {
            getFacesContext().addMessage(null, FacesMessageUtils.getMessageForCustomerSaveError(getFacesContext()));
            printStackTrace(throwable);
        }       

        initCustomerDTO();              
    }   

    private void initCustomerDTO() {
        customerDTO = new CustomerDTO();
    }

    public CustomerDTO getCustomerDTO() {
        return customerDTO;
    }

    public void setCustomerDTO(CustomerDTO customerDTO) {
        this.customerDTO = customerDTO;
    }
}

CustomerDTO 是 POJO。

jsf 包含:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:pe="http://primefaces.org/ui/extensions">

    <h:form id="customerForm">

        <p:inputText id="customerName" styleClass="customerName"
            autocomplete="off"
            label="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerName']}"
            value="#{adminController.customerDTO.customerName}"
            required="true" />


        <p:commandButton value="#{adbBundle['saveButton']}"
            actionListener="#{adminController.saveCustomer}"
            icon="ui-icon-check"
            update=":growl, @form, :adminTabView:customerListForm:customerListPanel" />     

    </h:form>

</ui:composition>

我还有一个自定义转换器类,用于修剪空白String

@FacesConverter(forClass = String.class)
public class StringTrimmer implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (StringUtils.isBlank(value)) {
            if (component instanceof EditableValueHolder) {
                ((EditableValueHolder) component).setSubmittedValue(null);
            }
            return null;
        }
        return value;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return value.toString();
    }
}

因此,当页面首次加载时,输入字段包含“测试”。我清理了测试字段,然后单击保存按钮。我收到了必填字段验证的错误消息,但输入再次填充了我之前设置的默认值“Test”。

我该如何解决这个问题?

更新:

我在 JBoss AS7 中运行 Mojarra 2.1.7,这是 JBoss 的实现和 Primefaces 3.4.2。

【问题讨论】:

  • 查看 primefaces resetInput 实用程序。
  • @Cagatay:他的具体问题有些不同。重置输入仅在表单提交时处理输入但在表单呈现时更新时有用。 &lt;p:commandButton&gt; 已经默认为 process="@form"

标签: java validation jsf-2 primefaces requiredfieldvalidator


【解决方案1】:

您的问题是由转换器引起的。

当特定组件的 JSF 验证失败时,提交的值会保留在组件中,否则会被清空并设置为本地值。当 JSF 完成所有组件的验证并且没有人验证失败时,所有本地值都将被清空并设置为模型值(引用为 value 属性的那个)。当 JSF 需要重新显示带值的表单时,首先检查提交的值是否不为空,然后显示,否则检查本地值是否不为空,然后显示,否则直接显示模型值。

在您的情况下,无论验证结果如何,您都将提交的空字符串值转换为 null。所以提交的值总是null,因此JSF总是会重新显示模型值而不是空字符串提交值。

我相信你宁愿需要以下上下文参数而不是转换器,当然如果唯一的目标是防止模型值在提交空输入时被空字符串污染。

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

或者,如果您的唯一目标真的是从字符串中删除空格,正如转换器类名称所暗示的那样,那么您根本不应该触摸提交的值。您可以在此处找到具体示例:Why does <h:inputText required="true"> allow blank spaces? getAsObject() 不会设置为提交值,而是设置为本地值(验证成功时),最终设置为模型值。

【讨论】:

  • 非常感谢。我没有使用 而是按照您的指示更改了转换器。它解决了我的问题。再次感谢。 :)。您的回答被接受并赞成。你是JSF之神。
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多