【问题标题】:FreeMarker using javax.json.JsonObject as Data ModelFreeMarker 使用 javax.json.JsonObject 作为数据模型
【发布时间】:2016-05-31 20:59:55
【问题描述】:

我正在测试 FreeMarker

Maven 依赖项:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.0.4</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
</dependencies>

简单类用户

public class User {

    private String firstName;
    private String lastName;
    private String email;

    public User(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

简单的 FreeMarker 文件(basicJson.ftl):

Name: ${user.firstName} ${user.lastName}

用于创建配置的类:

import java.io.File;
import java.io.IOException;

import freemarker.template.Configuration;
import freemarker.template.TemplateExceptionHandler;

public class FreemarkerConfigurationFactory {

    public static Configuration newFreemarkerConfiguration() throws IOException {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
        cfg.setDirectoryForTemplateLoading(new File("./templates/tests/"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        cfg.setLogTemplateExceptions(false);
        return cfg;
    }

}

测试类:

import static org.junit.Assert.assertEquals;

import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonObject;

import org.junit.Before;
import org.junit.Test;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class FreemarkerJsonTest {

    private Configuration cfg;
    private ByteArrayOutputStream output;
    private Template template;
    private Writer writer;
    private Map<String, Object> map;

    @Before
    public void setUp() throws Exception {
        cfg =  FreemarkerConfigurationFactory.newFreemarkerConfiguration();
        output = new ByteArrayOutputStream();
        writer = new OutputStreamWriter(output);
        map = new HashMap<>();
    }

    @Test
    public void objectTest() throws Exception {
        User user = new User("Clarice", "Leman", "clarice.leman@domain.com");
        map.put("user", user);
        String outputString = process("basicJson.ftl", map);
        assertEquals("Name: Clarice Leman", outputString);
    }

    @Test
    public void jsonTest() throws Exception {
        JsonObject jsonUser = Json.createObjectBuilder()
            .add("id", 10)
            .add("firstName", "Clarice")
            .add("lastName", "Leman")
            .add("email", "clarice.leman@domain.com")
            .build();

        map.put("user", jsonUser);
        String outputString = process("basicJson.ftl", map);
        assertEquals("Name: Clarice Leman", outputString);
    }

    private String process(String templateName, Object root) throws Exception {
        template = cfg.getTemplate(templateName);
        template.process(root, writer);
        return output.toString();
    }

}

问题是测试“objectTest()”通过但测试“jsonTest()”没有通过,因为它产生了一个字符串:

Name: "Clarice" "Leman"

使用在线 FreeMarker 模板 (http://freemarker-online.kenshoo.com/):

模板:

Name: ${user.firstName} ${user.lastName}

数据模型:

user = {"firstName":"Clarice","lastName":"Leman","email":"clarice.leman@domain.com"}

结果

Name: Clarice Leman

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    您在 FreeMarker Online 上输入的 JSON 在传递给 FreeMarker 本身之前由 FreeMarker Online 转换为 List-s 和 Map-s。整个框的语法特定于该在线服务。因此,如果您要显示 JSON,则必须将其转换为 FreeMarker 的默认 ObjectWrapper 已经理解的内容,或者必须扩展 ObjectWrapper 以理解 javax.json 类。 (但通常,无论如何,您都将 JSON 绑定到一些特定于应用程序的类,而这些类通常已经使用 JavaBeans 约定和 List-s,默认的 ObjectWrapper 可以理解这些类。)

    【讨论】:

    • 嗨@ddekany,感谢您的回答。我认为 FreeMarker 已经处理了 javax.json 类,因为输出显示了预期的值,除了引用了字符串值。
    • 您肯定会看到这些对象的toString() 返回值。 FreeMarker 的默认ObjectWrapper 会将它不理解的对象包装起来作为字符串使用,通过调用toString() 计算字符串值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2022-12-06
    • 2011-05-05
    相关资源
    最近更新 更多