freemarker 直接使用List来遍历set集合,可能会报错

转摘:http://www.javaweb1024.com/java/JavaWebzhongji/2015/04/08/528.html

freemarker  直接使用List来遍历set集合,可能会报错! 错误如下 

Java代码

private Set<Article> articles = new HashSet<Article>();

Freemarker中遍历

[#list category.articles?chunk(5) as article1]
     <div>
         <ul>
              [#list article1 as article ]
                [#assign articleDesc=i18n_description(article.articleDescriptions,true)/]
                [#if articleDesc!=null]
         ${abbreviate(articleDesc.title, 80, "...")}
         [/#if]
            [/#list]
          </ul>
      </div>
 [/#list]

 报错信息

Underlying collection is not a list, it's org.hibernate.collection.internal.PersistentSet

freemarker.template.TemplateModelException: Underlying collection is not a list, it's org.hibernate.collection.internal.PersistentSet

         at freemarker.ext.beans.CollectionModel.get(CollectionModel.java:127)

         at freemarker.core.SequenceBuiltins$chunkBI$ChunkedSequence$1.get(SequenceBuiltins.java:792)

         at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:176)

         at freemarker.core.Environment.visit(Environment.java:428)

         at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.MixedContent.accept(MixedContent.java:92)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)

         at freemarker.core.Environment.visit(Environment.java:428)

         at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.MixedContent.accept(MixedContent.java:92)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.MixedContent.accept(MixedContent.java:92)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.MixedContent.accept(MixedContent.java:92)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)

         at freemarker.core.Environment.visit(Environment.java:428)

         at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)

         at freemarker.core.Environment.visit(Environment.java:221)

         at freemarker.core.Environment$1.render(Environment.java:246)

         at com.eecart.template.directive.BaseDirective.setLocalVariable(BaseDirective.java:184)

         at com.eecart.template.directive.ArticleCategoryRootListDirective.execute(ArticleCategoryRootListDirective.java:51)

         at freemarker.core.Environment.visit(Environment.java:274)

         at freemarker.core.UnifiedCall.accept(UnifiedCall.java:126)

         at freemarker.core.Environment.visit(Environment.java:221)

解决方案:

不直接使用 articles

@Transient

   public List<Article> getMyArticles(){

      List<Article> list = new ArrayList<Article>(articles);

      return list;

   }

原文地址:https://www.cnblogs.com/zihan1120/p/4410008.html