0

選択リスト付きのフォーム:

<p:inputText id="number" value="#{accountNumberBean.account.accountNumber}" required="true" label="#{msg['newAccountNumberForm.number']}">
    <f:validateLength maximum="50" for="name" />
</p:inputText>

<p:message for="number" display="text" />

<p:pickList id="integrations" value="#{accountNumberBean.integrations}" var="integration" itemLabel="#{integration.name} (#{integration.backend.name})" itemValue="#{integration}" converter="integrationConverter">
    <f:facet name="sourceCaption">#{msg['newAccountNumberForm.integrations.available']}/>
    <f:facet name="targetCaption">#{msg['newAccountNumberForm.integrations.used']}/>
</p:pickList>
<p:commandButton value="#{msg['button.createAndNext']}" action="#{accountNumberBean.addNewAndStay}" update="@form" />

入力した数字を入力しない場合は、コマンドボタンをクリックします。検証メッセージが表示されますが、選択リストのオブジェクトのラベルが更新され、空の角かっこのみになります。

itemLabel="#{integration.name} (#{integration.backend.name})"

それらを選択して名前を入力すると、すべて問題ありません(最初に名前を入力したかのように機能します)。したがって、問題はラベルだけです。これは私のコンバーターです:

@FacesConverter(forClass = Integration.class, value = "integrationConverter")
public class IntegrationConverter implements Converter {

    /**
     * {@inheritDoc} 
     */
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Integration integration = new Integration();
        integration.setId(Long.parseLong(value));
        return integration;
    }

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

}

そして、統合を取得するためのBeanのメソッド(Beanはビュースコープ):

public DualListModel<Integration> getIntegrations() {
        integrations.setSource(customerService.getIntegrations(customer));
        return integrations;
    }

ラベルが空になる原因は何ですか?

4

1 に答える 1

0

コンバーターでは、pojoのid値のみを渡すため、変換されると、基本的にIDが設定されたnullオブジェクトになります。

コンバーターを以下に変更すると、最初のラベルが正しく表示される可能性があります。

 /**
 * {@inheritDoc} 
 */
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    Integration integration = new Integration();
    String[] split = value.split("_");
    integration.setId(split[0]);
    integration.setName(split[1]);
    return integration;
}

/**
 * {@inheritDoc} 
 */
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    Integration i = (Integration) value;
    return i.getId() + "_" + i.getName();
}

ただし、クラスが永続エンティティである場合は、コンバーターのデータベースからオブジェクトを取得する必要がある場合は、次のコードを確認してください。

private SessionFactory sessionFactory;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    Object object = null;

    if (StringUtils.isNotBlank(value)) {
        try {
            int underscoreIndex = value.indexOf("_");
            String className = value.substring(0, underscoreIndex);
            String id = value.substring(underscoreIndex + 1, value.length());

            Class<?> clazz = Class.forName(className);
            object = getSessionFactory().getCurrentSession().get(clazz, Long.parseLong(id));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    return object;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    String result = null;

    if (value != null && !value.equals("")) {
            Integration obj = (Integration) value;
            result = Hibernate.getClass(obj).getName() + "_" + obj.getId();
        }
    return result;
}

private SessionFactory getSessionFactory() {
    if(sessionFactory == null) {
        sessionFactory = ((SessionFactory) FacesContextUtils                    .getWebApplicationContext(FacesContext.getCurrentInstance())
                .getBean("sessionFactory"));
    }

    return sessionFactory;
}

HibernateとSpringを使用していて、sessionFactoryBeanがアプリケーションコンテキストで定義されていることを前提としています。

于 2013-02-25T15:55:37.670 に答える