ultraq / thymeleaf-layout-dialect

A dialect for Thymeleaf that lets you build layouts and reusable templates in order to improve code reuse

Home Page:https://ultraq.github.io/thymeleaf-layout-dialect/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

layout:decorate does not work

nickterekhin opened this issue · comments

Hi

My Environment:
Spring 5.2.1
Thymeleaf 3.0.11
Thymeleaf-layout-dialect 2.4.1 / 2.4.0
gradle
gretty + servletContainer = tomcat8

here is my index.html

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{mainlayout}">
<head>
    <title>Title</title>
</head>
<body>
<div layout:fragment="content">
Content Title
</div>
</body>
</html>

here is my mainlayout.html

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <title>Main Page</title>
</head>
<body>
<div layout:fragment="content">
    Main Page
</div>
</body>
</html>

Versions 2.4.1 and 2.4.0 are not working in this case:
here is the error what i got:

in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "ServletContext resource [/templates/index.html]")] with root cause
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.StringBuffer

But Version 2.3.0 is working

Hi there, I've spent a while trying to recreate the issue but without success. I've also tried looking at a diff of the code between versions 2.3.0 to 2.4.0 but there are a lot of changed lines and nothing is really sticking out to me that could be the cause of the error you're getting.

Are you able to share more of the stack trace, particularly any lines that point to lines that involve the layout dialect to help me narrow my search?

If not, are you able to create a minimal test case or project that reproduces the error?

Lastly, I'm currently working on an upcoming 2.5.0 version and I wonder if the bug still exists in that version. Are you able to try the 2.5.0-SNAPSHOT version of the layout dialect in your project to see if that might resolve your problems?

Here is the stacktrace:

type Exception report

message Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "ServletContext resource [/templates/index.jsp]")

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "ServletContext resource [/templates/index.jsp]")
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "ServletContext resource [/templates/index.jsp]")
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
	org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
	org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362)
	org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

org.attoparser.ParseException: Error during execution of processor 'nz.net.ultraq.thymeleaf.decorators.DecorateProcessor' (template: "index" - line 4, col 7)
	org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
	org.attoparser.MarkupParser.parse(MarkupParser.java:257)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
	org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
	org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362)
	org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'nz.net.ultraq.thymeleaf.decorators.DecorateProcessor' (template: "index" - line 4, col 7)
	org.thymeleaf.processor.element.AbstractAttributeModelProcessor.doProcess(AbstractAttributeModelProcessor.java:134)
	org.thymeleaf.processor.element.AbstractElementModelProcessor.process(AbstractElementModelProcessor.java:98)
	org.thymeleaf.util.ProcessorConfigurationUtils$ElementModelProcessorWrapper.process(ProcessorConfigurationUtils.java:649)
	org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1510)
	org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205)
	org.thymeleaf.engine.Model.process(Model.java:282)
	org.thymeleaf.engine.Model.process(Model.java:290)
	org.thymeleaf.engine.GatheringModelProcessable.process(GatheringModelProcessable.java:78)
	org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640)
	org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleCloseElementEnd(TemplateHandlerAdapterMarkupHandler.java:388)
	org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322)
	org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleCloseElementEnd(OutputExpressionInlinePreProcessorHandler.java:220)
	org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:164)
	org.attoparser.HtmlElement.handleCloseElementEnd(HtmlElement.java:169)
	org.attoparser.HtmlMarkupHandler.handleCloseElementEnd(HtmlMarkupHandler.java:412)
	org.attoparser.MarkupEventProcessorHandler.handleCloseElementEnd(MarkupEventProcessorHandler.java:473)
	org.attoparser.ParsingElementMarkupUtil.parseCloseElement(ParsingElementMarkupUtil.java:201)
	org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:725)
	org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301)
	org.attoparser.MarkupParser.parse(MarkupParser.java:257)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
	org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
	org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362)
	org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.StringBuffer
	org.codehaus.groovy.runtime.dgm$1123.invoke(Unknown Source)
	org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
	org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
	org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	nz.net.ultraq.thymeleaf.context.extensions.IContextExtensions$_apply_closure1$_closure4.doCall(IContextExtensions.groovy:77)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:84)
	org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
	org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
	org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	nz.net.ultraq.thymeleaf.models.AttributeMerger.merge(AttributeMerger.groovy:68)
	nz.net.ultraq.thymeleaf.models.ModelMerger$merge.call(Unknown Source)
	org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
	nz.net.ultraq.thymeleaf.decorators.html.HtmlHeadDecorator.decorate(HtmlHeadDecorator.groovy:69)
	nz.net.ultraq.thymeleaf.decorators.Decorator$decorate.call(Unknown Source)
	org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
	nz.net.ultraq.thymeleaf.decorators.html.HtmlDocumentDecorator.decorate(HtmlDocumentDecorator.groovy:72)
	nz.net.ultraq.thymeleaf.decorators.Decorator$decorate.call(Unknown Source)
	org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
	nz.net.ultraq.thymeleaf.decorators.DecorateProcessor.doProcess(DecorateProcessor.groovy:137)
	org.thymeleaf.processor.element.AbstractAttributeModelProcessor.doProcess(AbstractAttributeModelProcessor.java:77)
	org.thymeleaf.processor.element.AbstractElementModelProcessor.process(AbstractElementModelProcessor.java:98)
	org.thymeleaf.util.ProcessorConfigurationUtils$ElementModelProcessorWrapper.process(ProcessorConfigurationUtils.java:649)
	org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1510)
	org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205)
	org.thymeleaf.engine.Model.process(Model.java:282)
	org.thymeleaf.engine.Model.process(Model.java:290)
	org.thymeleaf.engine.GatheringModelProcessable.process(GatheringModelProcessable.java:78)
	org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640)
	org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleCloseElementEnd(TemplateHandlerAdapterMarkupHandler.java:388)
	org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322)
	org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleCloseElementEnd(OutputExpressionInlinePreProcessorHandler.java:220)
	org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:164)
	org.attoparser.HtmlElement.handleCloseElementEnd(HtmlElement.java:169)
	org.attoparser.HtmlMarkupHandler.handleCloseElementEnd(HtmlMarkupHandler.java:412)
	org.attoparser.MarkupEventProcessorHandler.handleCloseElementEnd(MarkupEventProcessorHandler.java:473)
	org.attoparser.ParsingElementMarkupUtil.parseCloseElement(ParsingElementMarkupUtil.java:201)
	org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:725)
	org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301)
	org.attoparser.MarkupParser.parse(MarkupParser.java:257)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
	org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
	org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
	org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
	org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362)
	org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

I am currently using spring-boot 2.2.5.RELEASE with thymeleaf 3.0.11.RELEASE and thymeleaf-layout-dialect 2.4.1 (excluding the thymeleaf 3.0.0.RELEASE dependency) and it works just fine. Also using JDK 1.8.0_102.

Going to close this one - still can't replicate, but some things that have changed which might help:

  • I've updated the Groovy dependency as the version used when this issue was raised had some weird bytecode problems in certain situations (another one I've witnessed is with the AWS S3 SDK) and manifested like the above
  • The code involved in the stack trace has also changed quite a bit (using Groovy extension modules instead of updating the metaclass) so I'm hoping that helps too