【问题标题】:Unable to access property of type java.util.Collections$UnmodifiableSet无法访问 java.util.Collections$UnmodifiableSet 类型的属性
【发布时间】:2023-03-20 18:37:01
【问题描述】:

我正在迭代具有实例变量statisticsCurrency 的EquityStatisticsSet 类型的unmodifiableSet。迭代时我收到以下错误属性'statisticsCurrency' not found on type java.util.Collections$UnmodifiableSet。

我哪里出错了?请帮助我。

以下是 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)

【问题讨论】:

  • 你的
  • @RongNK 是

标签: java jsf-2


【解决方案1】:

Until the upcoming JSF 2.2UIData 组件不支持Set 接口。他们只支持例如DataModelListObject[]ResultSet等。根据JSF 2.2,将添加Collection,不仅包括List,还包括Set

您当前的最佳选择是借助新的 EL 2.2 调用任意方法的能力,通过 Set#toArray()Set 转换为数组:

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

然而,这是相当昂贵的,因为 toArray() 基本上在每次迭代中都会被调用。在幕后,toArray() 迭代整个Set 并创建一个数组。没有“支持数组”。这最终以 O(n^2) 复杂度而不是 O(1) 为数组或 ArrayList。如果实在无法事先将其转换为数组或模型中的List(而不是在getter中!),那么您最好使用&lt;c:set&gt;对其进行一次评估并将其存储在请求范围内。

<c:set var="equityStatistics" value="#{commonStockController.equityStatistics.toArray()}" scope="request" />
<p:dataTable ... value="#{equityStatistics}">

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2021-10-15
    • 2017-05-03
    • 2014-12-09
    • 2023-03-24
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多