2

ビュー scopped バッキング 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;
    }
}

CustomerDTOPOJOです。

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>

blank をトリミングするためのカスタム コンバーター クラスもあります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」が含まれています。テストフィールドを一掃し、保存ボタンをクリックしました。必須フィールドの検証に関するエラー メッセージを受け取りましたが、以前に設定したデフォルト値「Test」が入力に再度入力されます。

どうすれば問題を解決できますか?

アップデート:

私は、JBoss の実装である Mojarra 2.1.7 と Primefaces 3.4.2 を使用して JBoss AS7 で実行しています。

4

1 に答える 1

3

あなたの問題はコンバーターによって引き起こされます。

特定のコンポーネントのJSF検証が失敗した場合、送信された値はコンポーネントに保持されます。それ以外の場合は、nullアウトされ、ローカル値として設定されます。JSFがすべてのコンポーネントの検証を終了し、検証に失敗した人がいない場合、すべてのローカル値がヌルになり、モデル値(value属性として参照される値)として設定されます。JSFは、フォームに値を再表示する必要がある場合、最初に送信された値がnullでないかどうかを確認してから表示します。そうでない場合は、ローカル値がnullでないかどうかを確認してから表示します。それ以外の場合は、モデル値を完全に表示します。

あなたの場合、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>

または、コンバーターのクラス名が示すように、文字列から空白を削除することが唯一の目標である場合は、送信された値にまったく触れないでください。ここで具体的な例を見つけることができます:なぜ<h:inputText required = "true">は空白を許可するのですか?getAsObject()送信された値として設定されませんが、代わりにローカル値(検証が成功した場合)として設定され、最終的にはモデル値として設定されます。

于 2012-12-22T16:44:14.627 に答える