【问题标题】:How to use Thymeleaf to process YAML files?如何使用 Thymeleaf 处理 YAML 文件?
【发布时间】:2017-07-15 03:45:03
【问题描述】:

我正在尝试使用 Thymeleaf 处理 YAML 文件。示例文件如下:

apiVersion: v1
kind: Service
metadata:
  name: [[${app['name']}]]
  labels:
    app: [[${app['name']}]]
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    name: http
  - port: 443
    protocol: TCP
    name: https
  selector:
    app: nginx

app.name 来自我在运行时解析的另一个 YAML 文件。

到目前为止我已经尝试过:

  1. 使用Properties 创建MessageSource

    TemplateEngine templateEngine = new TemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);
    StandardMessageResolver messageResolver = new StandardMessageResolver();
    messageResolver.setDefaultMessages(props); // contains app.name
    templateEngine.setMessageResolver(messageResolver);
    
  2. 在上下文中设置变量

    map.put("app.name", "test");
    context.setVariables(map); // contains app.name
    

但我不断收到错误消息:

Exception evaluating OGNL expression: "app['name']
...
Caused by: ognl.OgnlException: source is null for getProperty(null, "name")

使用 Thymeleaf 3.0.3.RELEASE。我使用的是 Spring 而不是 Spring,因为 spring-boot-starter-thymeleaf 带来了 HTML 最需要的大量包袱,我决定自己实例化模板解析器和引擎。似乎人们很少使用 Thymeleaf 处理 TEXT;我遇到的所有示例都是 HTML。

我还想知道如何在我的模板中包含 YAML 片段。

编辑: 感谢@Metroids,我得到了它的工作。这是我的示例应用程序的link,以防其他人遇到类似问题。

【问题讨论】:

    标签: spring thymeleaf template-engine


    【解决方案1】:

    我认为这里对如何访问属性有些困惑...如果您想在模板中使用表达式${app['name']},您的上下文应该如下所示:

    Map<String, Object> app = new HashMap<>();
    app.put("name", "test");
    
    Context context = new Context();
    context.setVariable("app", app);
    engine.process("template", context);
    

    使用map.put("app.name", "test"); 不是一个好主意,因为something.something 的语法在表达式语言中具有意义(在对象上调用getter/setter)。

    编辑:包含文本模板看起来像这样:

    a.txt

    blah blah blah 
    [# th:insert="b"/] 
    blah blah blah 
    

    b.txt

    Text in b.txt
    that should be included
    

    编辑 2:如果你想使用消息,而不是上下文,这应该可以工作:

    apiVersion: v1
    kind: Service
    metadata:
      name: [[#{app.name}]]
      labels:
        app: [[#{app.name}]]
    

    【讨论】:

    • 这就是我最终所做的。我的印象是MessageResolver 能够解析app.name,因为这是消息键的常见格式,但事实并非如此。请同时使用片段更新您的回复,我会接受。
    • 啊,你是百里香论坛上的同一个人……明白了,哈哈。
    • 我发现[# th:text="#{app.name}"/] 也适用于消息。不过,您的语法更简洁。谢谢您的帮助。为了将来的人们的利益,我编辑了我的问题,以包含指向我正在开发的示例应用程序的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2016-11-05
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多