如何使用 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 文件。
到目前为止我尝试过的:
用Properties
创建MessageSource
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
StandardMessageResolver messageResolver = new StandardMessageResolver();
messageResolver.setDefaultMessages(props); // contains app.name
templateEngine.setMessageResolver(messageResolver);
在上下文中设置变量
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}]]
我正在尝试使用 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 文件。
到目前为止我尝试过的:
用
创建Properties
MessageSource
TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); StandardMessageResolver messageResolver = new StandardMessageResolver(); messageResolver.setDefaultMessages(props); // contains app.name templateEngine.setMessageResolver(messageResolver);
在上下文中设置变量
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}]]