2010-07-14 7 views
0

Je suis en train de mettre à jour notre application de Webwork à Struts2. Aujourd'hui, je rencontre une erreur étrange: displayTag a cessé de fonctionner après la mise à niveau.Struts2 + Freemarker + DisplayTag: comment le faire fonctionner

C'est un Snipped de mon fichier FTL:

 
<#assign display=JspTaglibs["http://displaytag.sf.net"]> 

<@s.set name="entries" value="historyEntries" scope="page"/> 

<@display.table class="data" name="pageScope.entries" sort="list" 
     pagesize=30 id="entry" defaultsort=5 defaultorder="descending"> 
    <@display.column property="folderName" title="Folder" sortable=true/> 
</@display.table> 

L'erreur que je reçois est:

freemarker.template.TemplateModelException: 
javax.servlet.jsp.JspException: Exception: 
[.LookupUtil] Error looking up property "folderName" 
in object type "freemarker.template.SimpleSequence". 
Cause: Unknown property 'folderName'

balises entretoises standard fonctionnent correctement, j'ai JspSupportServlet ajouté dans ma configuration. N'importe quel idead pourquoi ceci ne fonctionne pas?

Répondre

0

J'ai trouvé un moyen de résoudre ce problème (je ne sais pas si c'est le seul moyen ou si c'est le meilleur, a travaillé pour moi).

La racine du problème est que freemarker.template.SimpleSequence ne le fait pas hors-the-box mettre en œuvre une API standard des collections, ce n'est pas une collection, Enumerable etc.

Afin de résoudre ce que j'ai créé sur mesure FreemarkerManager et fourni sur mesure BeansWrapper:

 
@Override 
protected BeansWrapper getObjectWrapper() { 
    BeansWrapper wrapper = super.getObjectWrapper(); 
    class CustomBeansWrapper extends BeansWrapper { 
     private BeansWrapper internalWrapper; 

     public Xp2BeansWrapper(BeansWrapper wrapper) { 
      this.internalWrapper = wrapper; 
     } 

     //delegate methods 


     public TemplateModel wrap(Object object) throws TemplateModelException { 
      TemplateModel model = internalWrapper.wrap(object); 
      if (model instanceof SimpleSequence) { 
       class SimpleSequenceWithIterator extends SimpleSequence { 
        private SimpleSequence internalSequence; 
        public SimpleSequenceWithIterator(SimpleSequence sequence) { 
         this.internalSequence = sequence; 
        } 

        //delegate methods 

        //IteratorUtils from Apache Commons is used internally 
        //by DisplayTag library, it can use public iterator() method 
        public Iterator iterator() throws TemplateModelException { 
         return toList().iterator(); 
        } 

       } 
       return new SimpleSequenceWithIterator((SimpleSequence) model); 
      } 
      return model; 
     } 


    } 
    return new CustomBeansWrapper(wrapper); 

} 

maintenant, je avais juste besoin de changer un paramètre dans struts.properties:

struts.freemarker.manager.classname=xyz.CustomFreemarkerManager 
+0

la valeur du paramètre de réglage object_wrapper peut être réglé sur freemarker.ext.beans.BeansWrapper pour assurer l'emballage simple n'est pas utilisé – skipy

Questions connexes