4

ここでまた困った。私のポイントは次のとおりです。私のプロジェクトでは、(明らかに) SelectOneMenu コンポーネントの項目をそれぞれの Bean のリスト プロパティに変換するためのコンバーターが必要です。私のjsfページには次のものがあります:

<p:selectOneMenu id="ddlPublicType" value="#{publicBean.selectedPublicType}"    effect="fade" converter="#{publicBean.conversor}" > 
    <f:selectItems value="#{publicoBean.lstPublicTypes}" var="pt" itemLabel="#{pt.label}" itemValue="#{pt.value}"></f:selectItems>
</p:selectOneMenu>

そして私の豆は:

@ManagedBean(name = "publicBean")
@RequestScoped
public class PublicBean {

// Campos
private String name; // Nome do evento
private TdPublicType selectedPublicType = null;
private List<SelectItem> lstPublicTypes = null;
private static PublicTypeDAO publicTypeDao; // DAO 

static {
    publicTypeDao = new PublicTypeDAO();
}
// Construtor

public PublicoBean() {

    lstPublicTypes = new ArrayList<SelectItem>();
    List<TdPublicType> lst = publicTypeDao.consultarTodos();
    ListIterator<TdPublicType> i = lst.listIterator();
    lst.add(new SelectItem("-1","Select..."));
    while (i.hasNext()) {
        TdPublicType actual = (TdPublicType) i.next();
        lstPublicTypes.add(new SelectItem(actual.getIdPublicType(), actual.getNamePublicType()));
    }

}

// Getters e Setters

...

public Converter getConversor() {
    return new Converter() {
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            // This value parameter seems to be the value i had passed into SelectItem constructor
            TdPublicType publicType = null; // Retrieving the PublicType from Database based on ID in value parameter
            try {
                if (value.compareTo("-1") == 0 || value == null) {
                    return null;
                }
                publicType = publicTypeDao.findById(Integer.parseInt(value));
            } catch (Exception e) {
                FacesMessage msg = new FacesMessage("Error in data conversion.");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                FacesContext.getCurrentInstance().addMessage("info", msg);
            }
            return publicType;
        }

        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value) {
            return value.toString(); // The value parameter is a TdPublicType object ?
        }
    };
}

...
}

getAsObject()メソッドでは、値パラメーターは、SelectItem コンストラクターに渡した値のようです。しかし、getAsString()メソッドでは、値も ID の文字列表現のようです。このパラメーターは TdPublicType 型であってはなりませんか? 私のコードに何か問題がありますか?

4

3 に答える 3

4

は、 ( type の場合) をインスタンスを一意に識別する にgetAsString()変換する必要があります。たとえば、ID を使用して、HTML コードにインライン化し、HTTP 要求パラメーターとして渡すことができます。は、送信された HTTP 要求パラメーターを元のオブジェクト インスタンスに変換できるように、その一意の表現を具体的なインスタンスに正確に変換する必要があります。ObjectTdPublicTypeStringgetAsObject()StringObject

基本的に(簡単な事前チェックと例外処理は省略):

@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) throws ConverterException {
    // Convert Object to unique String representation for display.
    return String.valueOf(((TdPublicType) modelValue).getId());
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) throws ConverterException {
    // Convert submitted unique String representation back to Object.
    return tdPublicTypeService.find(Long.valueOf(submittedValue));
}

更新:別の問題があります。インスタンス自体ではなく、クラスのvalueプロパティを項目値として指定しています。このようにして、コンバーターは .xml内のインスタンスではなくプロパティを取得します。それに応じて修正します。TdPublicTypeTdPublicTypevalueTdPublicTypegetAsString()

<f:selectItems value="#{publicoBean.lstPublicTypes}" var="pt" 
    itemLabel="#{pt.label}" itemValue="#{pt}"/>
于 2012-08-31T00:10:00.497 に答える
0

これでコードが機能します。私のエラーはロード方法にありました。私はこれをしていました:

// Loading menu
List<TdPublicType> l = daoPublicType.retrieveAll();
Iterator<TdPublicType> i = l.iterator();
while (i.hasNext()) {
    TdPublicType actual = (TdPublicType) i.next();
    lstMenuPublicType.add(new SelectItem(actual.getIdtPublicType(), actual.getNamePublicType()));
}

しかし、正しい方法は次のとおりです。

// Loading menu
List<TdPublicType> l = daoPublicType.retrieveAll();
Iterator<TdPublicType> i = l.iterator();
while (i.hasNext()) {
    TdPublicType actual = (TdPublicType) i.next();
    lstMenuPublicType.add(new SelectItem(actual, actual.getNamePublicType())); // In the first parameter i passed the PublicType object itself not his id.
} 
于 2012-08-31T16:19:39.033 に答える