3

javax.el.PropertyNotFoundException: /member/apps/cms/edit.xhtml @228,49 value="#{props.key}": Property 'key' not found on type java.util.HashMap$Values以下のデータテーブルを表示しようとするとエラーが発生します。

<p:dataTable id="properties" var="props" value="#{contentEditorBacking.properties}" editable="true">

    <p:column headerText="Property">
        <p:cellEditor>
            <f:facet name="output"> 
                <h:outputText value="#{props.key}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText value="#{props.key}" />
            </f:facet>
        </p:cellEditor>
    </p:column>
    <p:column headerText="Value">
        <p:cellEditor>
                        <f:facet name="output"> 
                <h:outputText value="#{props.value}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText value="#{props.value}" />
            </f:facet>
        </p:cellEditor>
    </p:column>

    <p:column headerText="Edit">
        <p:rowEditor />
        <!-- Need to put an update on here yet -->
        <p:commandLink styleClass="ui-icon ui-icon-trash" id="deleteProperty" actionListener="#{contentEditorBacking.deleteProperty}">
                 <f:attribute name="key" value="#{props.key}" />
             </p:commandLink>
    </p:column>
</p:dataTable>

これが私のcontentEditorBackingの関連部分です:

@ManagedBean
@ViewScoped
public class ContentEditorBacking {
    private Map<String, Properties> properties = new LinkedHashMap<String, Properties>();

    public Collection<Properties> getProperties() throws Exception{
        return properties.values();
    }

    public static class Properties{

        private String key;
        private String value;

        public Properties(String key, String value) {
            super();
            this.key = key;
            this.value = value;
        }

        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        @Override
        public String toString() {
            return "key=" + key + ", value=" + value + "";
        }

    }
}

プロパティマップからキー値にアクセスするにはどうすればよいですか?

4

4 に答える 4

6

今後のJSF2.2まで、<h:dataTable>/<p:dataTable>はをサポートしていませんCollection<E>。とりわけサポートするだけList<E>です。

交換する必要があります

public Collection<Properties> getProperties() throws Exception{
    return properties.values();
}

private List<Properties> propertiesAsList;

public List<Properties> getProperties() throws Exception{
    return propertiesAsList;
}

マップの初期化直後のどこかでこれを行います

propertiesAsList = new ArrayList<Properties>(properties.values());

(注:ゲッター内でそれを行わないでください!)

于 2012-07-18T23:37:15.363 に答える
2

JSFコードでは、コレクション全体であるgetProperties()メソッドによって返されるもののキープロパティにアクセスしようとしています。props変数を反復処理する必要があります。

于 2012-07-18T21:22:11.553 に答える
1

プロパティクラスは、ここでマップインターフェイスを実装する必要があります:http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

より良い質問は、なぜあなたはあなた自身のクラスを作成しているのですか?Javaは、SDKでPropertiesクラスを提供しています:http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

編集:OPのリクエストごとに私の答えを更新します

次の行を変更してから、Eclipseのコンパイルエラーを修正します。

public static class Properties{

に:

public static class Properties implements Map<String, String> {

編集#2:実際には私の答えはおそらく間違っています。OPは彼のxhtmlファイル全体を投稿しなかったので、私は間違った仮定をしました。

于 2012-07-18T21:09:34.320 に答える
1

dataTableはコレクション(たとえば、リスト)を受け取る必要があります。MapはCollectionインターフェースを実装していません。マップをリストに変換して変更してから、リストをマップに戻す必要があります。これを行う方法を示す良いリンクは次のとおりです。

もちろん、ゲッター/セッターにロジックを追加することはお勧めしません。代わりに、2つの異なる属性を使用して、ゲッターとセッターを可能な限りクリーンな方法で維持します。

于 2012-07-18T21:18:16.540 に答える