Я нашел способ решить эту проблему (не уверен, что это единственный способ, или если он лучший, но у меня все получилось).
Корень проблемы заключался в том, что freemarker.template.SimpleSequence
не осуществляет стандартную реализацию API коллекций, а не коллекцию, перечисление и т. Д.
Для решения этой проблемы я создал пользовательский FreemarkerManager
и предоставил пользовательский 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);
}
Теперь мне просто нужно изменить одну настройку в struts.properties
:
struts.freemarker.manager.classname=xyz.CustomFreemarkerManager