2013-04-20 4 views
-1

Я повторяю unmodifiableSet типа EquityStatisticsSet, которые имеют экземпляр переменной statisticsCurrency. while iterating я получаю следующую ошибку Property 'statisticsCurrency' не найден по типу java.util.Collections $ UnmodifiableSet.

, где я ошибаюсь? PLZ помочь мне.

следующие файлы xhtml и java.

.xhtml файл:

<p:dataTable id="equityStatisticsTable" 
      value="#{commonStockController.equityStatistics}" 
      var="equityStatistics"> 

    <p:column headerText="#{res.business_equity_statistics_statisticsCurrency_Label}"> 
    <gs:textInput 
    inputName="business_equity_statistics_statisticsCurrency" 
    inputValue="#{equityStatistics.statisticsCurrency}" /> 
    </p:column> 

код Java:

public Set<GSEquityStatistics> getEquityStatistics(){ 
     return new HashSet<GSEquityStatistics>(commonStock.getAllStatistics()); 
    } 

public Set<GSEquityStatistics> getAllStatistics() { 
     return Collections.unmodifiableSet(equityStatisticsSet); 
    } 

Исключение:

javax.servlet.ServletException: /content/business/security/commonStock.xhtml @166,64 
inputValue="#{equityStatistics.statisticsCurrency}": Property 'statisticsCurrency' not found on type java.util.Collections$UnmodifiableSet 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) 
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
+0

Имеет ли ваш

+0

@RongNK да Vipul

ответ

1

Until the upcoming JSF 2.2, UIData компоненты не поддерживают интерфейс Set. Они поддерживают только, например. DataModel, List, Object[], ResultSet и т. Д. В соответствии с JSF 2.2 будет добавлен Collection, который охватывает не только List, но и Set.

Ваш текущий лучший выбор для преобразования Set в массив с помощью Set#toArray() с помощью новой способности EL 2.2 для вызова произвольных методов:

<p:dataTable ... value="#{commonStockController.equityStatistics.toArray()}"> 

Однако, это довольно дорого, как toArray() является в основном вызывается на каждой итерации. Под обложками toArray() выполняет итерацию по всему Set и создает массив. Нет «массива поддержки». Это заканчивается сложностью O (n^2) вместо O (1), как в массиве, или ArrayList. Если вы действительно не можете преобразовать его в массив или List в модель заранее (не в getter!), То вам лучше использовать <c:set>, чтобы оценить ее один раз и сохранить в области запроса.

<c:set var="equityStatistics" value="#{commonStockController.equityStatistics.toArray()}" scope="request" /> 
<p:dataTable ... value="#{equityStatistics}"> 
Смежные вопросы