It's because if Team implements Set, List, Map, etc., then, by default, it
will only see the Collection/Map elements, and not the Java methods of the
object.
Probably the cleanest/idiomatic solution is if Team is not a Set, but
instead has a method like Set<User> getUsers(). Regardless of FreeMarker,
that's what I would do as a Java programmer.
But if it must be a Set, you can force FreeMarker to ignore that like this:
So you can do this:
public static class CustomObjectWrapper extends DefaultObjectWrapper {
public CustomObjectWrapper(Version incompatibleImprovements) {
super(incompatibleImprovements);
}
@Override
public TemplateModel wrap(Object obj) throws TemplateModelException
{
if (obj instanceof Team) {
return new GenericObjectModel(obj, this);
}
return super.wrap(obj);
}
}
and then where you create your Configuration singleton:
configuration.setObjectWrapper(new
CustomObjectWrapper(Configuration.VERSION_2_3_35));
Although now that being a Set was ignored, team is not #list-able in the
template (except with directly calling the Set API-s).
On Mon, Mar 24, 2025 at 12:00 PM Niels Basjes <[email protected]> wrote:
> Hi,
>
> I'm new to Freemarker and I'm looking for the right solution for
> something I ran into but have not been able to figure out.
>
> If I have a Java class like this:
>
> public static class Team {
> private final String name;
> public Team(String name) {
> this.name = name;
> }
> public String getName() {
> return name;
> }
> }
>
> If I then make a TemplateTest like this
>
> @Test
> public void testTeamName() throws Exception {
> Team team = new Team("Working");
> addToDataModel("team", team);
> assertEquals("Working", team.getName());
> assertOutput("${team.name}","Working");
> }
>
> and it all works.
> If I change my Team to be a subclass of a well known collection (I have
> tried TreeMap, TreeSet and ArrayList) then my .name attribute is no longer
> available in a template.
>
> public static class TeamSet extends TreeSet<User> {
>
>
> What is the proper way to solve this?
> Perhaps a custom Object Wrapper?
> Or is this something I should report as a bug?
>
> Thanks.
>
> Niels Basjes
> [email protected]
> [email protected]
>
--
Best regards,
Daniel Dekany