2017-02-24 26 views
2

私はThymeleafを使ってYAMLファイルを処理しようとしています。サンプルファイルは以下の通りである: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. が作成MessageSourceコンテキスト

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

しかし、私に変数を設定する

TemplateEngine templateEngine = new TemplateEngine(); 
templateEngine.setTemplateResolver(templateResolver); 
StandardMessageResolver messageResolver = new StandardMessageResolver(); 
messageResolver.setDefaultMessages(props); // contains app.name 
templateEngine.setMessageResolver(messageResolver); 
  • Propertiesとエラーが発生し続ける:

    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を使ってテキストを処理する人はほとんどいないようです。私が出会ったすべての例はHTMLです。

    テンプレートにYAMLの断片を含める方法も知っています。

    : @Metroidsのおかげで、私はそれを働かせました。他の誰かが同様の問題を抱えている場合は、私のサンプルアプリケーションにはlinkがあります。

  • 答えて

    2

    私はあなたのテンプレートで表現${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の構文は式言語(オブジェクト上のゲッター/セッターを呼び出す)で意味を持つため、良いアイデアです。

    編集:

    Text in b.txt 
    that should be included 
    

    編集2 B.TXT

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

    A.TXT::次のようになりますテキストテンプレートを含めるしたい場合文脈ではなくメッセージを使用するようにしてください。

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

    これは私が最終的にしたものです。私は、 'MessageResolver'が' app.name'を解決できる印象を受けました。それは、それがメッセージキーの一般的なフォーマットだからですが、そうではありませんでした。 あなたの返信をフラグメントインクルードで更新してください。私はそれを受け入れます。 –

    +0

    ああ、あなたはタイメリーフフォーラムの同じ人です...それを得ました。 – Metroids

    +0

    私は '[#th:text ="#{app.name} "/]'がメッセージに対しても機能することを発見しました。あなたの構文はより簡潔です。助けてくれてありがとう。来る人の利益のために、私が取り組んでいるサンプルアプリケーションへのリンクを含むように私の質問を編集しました。 –

    関連する問題