Java 为什么输入在所需字段验证后保留值

Java 为什么输入在所需字段验证后保留值,java,validation,jsf-2,primefaces,requiredfieldvalidator,Java,Validation,Jsf 2,Primefaces,Requiredfieldvalidator,当一个页面加载了一个绑定到视图范围支持bean中的一个值的输入,并且如果该值是预初始化的,那么在所需的字段验证之后,该输入将再次填充上一个值 下面是托管bean: @ManagedBean(name = "adminController") @ViewScoped public class AdminController extends BaseWebController implements Serializable { private static final long seria

当一个页面加载了一个绑定到视图范围支持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>
因此,当第一次加载页面时,输入字段包含“Test”。我清除了测试字段并单击save按钮。我收到了必填字段验证的错误消息,但输入再次被我之前设置的默认值“Test”填充

我怎样才能解决这个问题

更新:
我使用的是JBoss AS7和Mojarra 2.1.7,这是JBoss的实现和Primefaces 3.4.2。

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

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

在您的例子中,不管验证结果如何,都将空字符串提交值转换为
null
。因此提交的值总是
null
,因此JSF总是会重新显示模型值,而不是空字符串提交的值

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


javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_为_NULL
真的

或者,如果您的唯一目标真的是按照转换器类名的建议,从字符串中删除空白,那么您就不应该接触提交的值。您可以在这里找到一个具体的例子:
getAsObject()
不会设置为提交值,而是设置为本地值(验证成功时),最终设置为模型值。

请参阅primefaces resetInput实用程序。@Cagatay:他的具体问题有些不同。只有在表单提交时未处理输入,但在表单呈现时更新输入时,重置输入才有用。
已默认为
process=“@form”
。非常感谢。我没有使用转换器,而是按照您的指示更换了转换器。它解决了我的问题。再次感谢。:)。你的回答被接受并投了赞成票。你是JSF之神。
@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();
    }
}