如何使用 Thymeleaf 处理 YAML 文件?

How to use Thymeleaf to process YAML files?

我正在尝试使用 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,以防其他人遇到类似问题。

我认为这里对于如何访问属性存在一些混淆...如果您想在模板中使用表达式 ${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}]]