2017-02-24 3 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의 구문은 표현식 언어 (객체에 대한 getter/setter 호출)에서 의미가 있기 때문에 좋은 아이디어입니다.

    편집 :

    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

    아, 당신은 thymeleaf 포럼에서 같은 사람입니다 ... 하하. – Metroids

    +0

    '[# th : text = "# {app.name}"/]'이 메시지에서도 작동한다는 것을 알았습니다.그래도 구문은 더 간결합니다. 도와 주셔서 감사합니다. 앞으로 올 혜택을 받기 위해 필자는 작업중인 샘플 앱에 대한 링크를 포함하도록 내 질문을 편집했습니다. –