2012-07-18 2 views
3

아래의 데이터 테이블을 표시하려고 할 때 javax.el.PropertyNotFoundException: /member/apps/cms/edit.xhtml @228,49 value="#{props.key}": Property 'key' not found on type java.util.HashMap$Values 오류가 발생합니다.지도 키에 액세스하는 방법 jsf 데이터 테이블

<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 + ""; 
     } 

    } 
} 
난 내 속성의 키 값 매핑에 액세스 할 수있는 방법을

? http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

더 나은 질문은 생각입니다, 왜 당신이 당신의 자신의 클래스를 만드는 :

+0

귀하의 XHTML 파일의 큰 부분을 게시하십시오. –

+0

죄송합니다. 데이터 테이블 태그가 잘리지 않았습니다. 지금 거기에 있습니다. – Catfish

답변

6

곧 출시 될 JSF 2.2까지 <h:dataTable>/<p:dataTable>Collection<E>을 지원하지 않습니다. 그것은 다른 사람들 사이에서만 지원합니다 List<E>. 게터 내부에 그것을하지 않습니다

당신은이

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

(주 할

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

private List<Properties> propertiesAsList; 

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

에 의해 어딘가에 직접지도의 초기화 후 교체해야 !)

1

귀하의 속성 클래스는 여기지도 인터페이스를 구현해야? http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

편집 : 자바는 SDK의 속성 클래스를 제공

public static class Properties{ 

에 : 이클립스에서 컴파일 오류를 수정 한 후, 영업 이익의 요청

변경 다음 줄에 내 대답을 업데이트

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

편집 # 2 : 실제로 내 대답이 잘못되었습니다. OP는 그의 전체 xhtml 파일을 게시하지 않았고 나는 잘못되었다는 가정을했습니다.

+0

다른 종류의 속성입니다. – Catfish

+0

지도 인터페이스 구현 방법에 대한 코드를 제공해 주시겠습니까? 나는이 코드를 실제로 작성하지 않았다, 나는 단지 페이지에 대한 업데이트를하려고하고있다. 그리고 그것은 내가 배운대로 배우려고 노력하는 것보다 훨씬 더 고급 스럽다. – Catfish

1

dataTable은 컬렉션 (예 : List)을 받아야합니다. Map은 Collection 인터페이스를 구현하지 않습니다. 지도를 목록으로 변환하고 수정 한 다음 목록을 다시지도로 변환해야합니다.

, 내가 대신 게터/세터 로직을 추가 할 것을 권장이 다른 속성을 사용하고 게터를 유지하지 않습니다 여기에 그것을하는 방법을 보여주는 좋은 링크입니다 가능한 한 가장 깨끗한 방법으로 세팅하십시오.

2

JSF 코드에서 전체 컬렉션 인 getProperties() 메소드에 의해 반환 된 객체의 key 속성에 액세스하려고합니다. props 변수를 반복해야합니다.

관련 문제