Wie verwende ich FreeMarker, um verschachtelte Pojos zu erstellen?

Ich untersuche die Verwendung von FreeMarker zum Schreiben von EDI-Dateien. Dies sind im Grunde genommen stark formatierte (und validierte) elektronische Rechnungen. Ich habe beschlossen, zunächst ein einfaches Beispiel zu schreiben und bin nicht mehr in der Lage, ein 'verschachteltes Pojo' zu erstellen. Damit meine ich ein POJO, das POJOs enthält, bei denen beide Daten enthalten, die ich in meiner Ausgabe haben möchte. Ich habe einen Komponententest (in sich geschlossen) geschrieben, der aus einem unbekannten Grund fehlschlägt. Beim Ausführen des Tests erhalte ich die folgende Ausnahme:

Expression user.getSub is undefined on line 1, column 24 in simple.
The problematic instruction:
----------
==> ${user.getSub().user} [on line 1, column 22 in simple]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression user.getSub is undefined on line 1, column 24 in simple.
    at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:134)
    <snip>
    example.TestFreeMarkerTemplating.testSimpleTemplate(TestFreeMarkerTemplating.java:23)
    <snip>

Ich habe viele Variationen der Vorlage ausprobiert und keinen Erfolg gehabt. Dies ist der Test:

package example;

import java.io.*;
import org.junit.Test;
import freemarker.cache.StringTemplateLoader;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.*;

import static org.junit.Assert.*;

public class TestFreeMarkerTemplating {

Configuration cfg = new Configuration();
StringTemplateLoader stringLoader = new StringTemplateLoader();
{ cfg.setTemplateLoader(stringLoader);
cfg.setObjectWrapper(new BeansWrapper()); }

@Test
public void testSimpleTemplate() throws TemplateException, IOException{
    stringLoader.putTemplate("simple", "Welcome ${user}. Sub ${user.getSub().user}");
    Template temp = cfg.getTemplate("simple");
    StringWriter out = new StringWriter();
    temp.process(new TestPojo(), out);

    assertEquals("Welcome Andy. Sub Bill", out.toString());
}

public static class TestPojo {
    private final String user = "Andy";
    private final SubPojo sub = new SubPojo();

    public String getUser() { return user; }
    public SubPojo getSub() { return sub; }
}

public static class SubPojo {
    private final String user = "Bill";

    public String getUser() { return user; }
}

 }

Danke für jede Hilfe!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage