2016-05-19 8 views
3

Unterstützt Thymeleaf 3 Tiles 2 irgendwie? Es ist ein Paket, das ich wurde mit für Thumeleaf 2.xx thymeleaf-extras-tiles2-spring4 aber wie ich jetzt sehe, ist es nicht kompatibel aufgrund von Änderungen in org.thymeleaf.dialect.AbstractDialect KlasseThymeleaf 3 und Tiles2 Integration

Caused by: java.lang.NoSuchMethodError: org.thymeleaf.dialect.AbstractDialect: method <init>()V not found 
[INFO] at org.thymeleaf.extras.tiles2.dialect.TilesDialect.<init>(TilesDialect.java:46) 

Muss ich für eine Aktualisierung dieser Integration warten, müssen in der Lage sein, um mit T3 zu beginnen?

Gibt es eine Möglichkeit, dass ich Fliesen in Thymeleaf3

simulieren kann

ich so nur etwas meine Fliesen für verwenden:

<definition name="portal/**" template="layouts/portal"> 
    <put-attribute name="_head" value="/portal/{1} :: _head"/> 
    <put-attribute name="content" value="/portal/{1} :: content"/> 
    </definition> 
+0

keine Lösungen gefunden? –

+1

Ich habe die Lösung als die angenommene Antwort veröffentlicht. Ich hoffe es hilft. –

Antwort

0

dieses Problem habe ich einen Proxy für SpringTemplateEngine erstellt zu lösen und riet TemplateEngine.process() Methode.

Wie es funktioniert:

Die Codekartenlayouts auf der Grundlage des Vorlagenpfades zum Beispiel:

portal/moje_konto/moje_dane 

zu Layout abgebildet wird

LAYOUTS_PATH/portal 

Zusätzlich ist es passiert Variable VIEW enthält einen Pfad zur tatsächlichen Vorlage

Innerhalb von Layouts können spezifische Fragmente eingefügt werden. Sehr einfache Portallayout wie das aussehen:

<!DOCTYPE html SYSTEM "about:legacy-compat"> 
<html lang="pl" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.springframework.org/security/tags"> 
    <body> 
     <div th:replace="${'portal/' + VIEW} :: content">Content</div> 
    </body> 
</html> 

Controller:

@PreAuthorize("isAuthenticated()") 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Model model) { 

    return "portal/home/index"; 
    } 

TemplateEngine:

public class LayoutTemplateEngine implements ITemplateEngine, MessageSourceAware, InitializingBean { 

    private final Logger logger = Logger.getLogger(this.getClass().getName()); 

    private final String LAYOUTS_PATH = "layouts/"; 

    private final SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 

    @Override 
    public void process(TemplateSpec templateSpec, IContext context, Writer writer) { 
    String template = templateSpec.getTemplate(); 

    logger.info("Rendering template: " + template); 

    if (context instanceof WebExpressionContext) { 
     int end = template.indexOf("/"); 
     if (end != -1) { 
     // change template 
     templateSpec = new TemplateSpec(LAYOUTS_PATH + template.substring(0, end), templateSpec.getTemplateSelectors(), templateSpec.getTemplateMode(), templateSpec.getTemplateResolutionAttributes()); 
     // add VIEW variable 
     ((WebExpressionContext)context).setVariable("VIEW", template.substring(end + 1)); 
     } 
    } 

    templateEngine.process(templateSpec, context, writer); 
    logger.info("Rendering finished"); 
    } 

    public void setTemplateResolver(final ITemplateResolver templateResolver) { 
    templateEngine.setTemplateResolver(templateResolver); 
    } 

    public void setEnableSpringELCompiler(final boolean enableSpringELCompiler) { 
    templateEngine.setEnableSpringELCompiler(enableSpringELCompiler); 
    } 

    public void addDialect(final IDialect dialect) { 
    templateEngine.addDialect(dialect); 
    } 

    public void addTemplateResolver(final ITemplateResolver templateResolver) { 
    templateEngine.addTemplateResolver(templateResolver); 
    } 

    @Override 
    public IEngineConfiguration getConfiguration() { 
    return templateEngine.getConfiguration(); 
    } 

    @Override 
    public String process(String template, IContext context) { 
    return process(new TemplateSpec(template, null, null, null), context); 
    } 

    @Override 
    public String process(String template, Set<String> templateSelectors, IContext context) { 
    return process(new TemplateSpec(template, templateSelectors, null, null), context); 
    } 

    @SuppressWarnings("resource") 
    @Override 
    public String process(TemplateSpec templateSpec, IContext context) { 
    final Writer stringWriter = new FastStringWriter(100); 
    process(templateSpec, context, stringWriter); 
    return stringWriter.toString(); 
    } 

    @Override 
    public void process(String template, IContext context, Writer writer) { 
    process(new TemplateSpec(template, null, null, null), context, writer); 
    } 

    @Override 
    public void process(String template, Set<String> templateSelectors, IContext context, Writer writer) { 
    process(new TemplateSpec(template, templateSelectors, null, null), context, writer); 
    } 

    @Override 
    public IThrottledTemplateProcessor processThrottled(String template, IContext context) { 
    return processThrottled(new TemplateSpec(template, null, null, null), context); 
    } 

    @Override 
    public IThrottledTemplateProcessor processThrottled(String template, Set<String> templateSelectors, IContext context) { 
    return processThrottled(new TemplateSpec(template, templateSelectors, null, null), context); 
    } 

    @Override 
    public IThrottledTemplateProcessor processThrottled(TemplateSpec templateSpec, IContext context) { 
    return templateEngine.processThrottled(templateSpec, context); 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
    templateEngine.afterPropertiesSet(); 
    } 

    @Override 
    public void setMessageSource(MessageSource messageSource) { 
    templateEngine.setMessageSource(messageSource); 
    } 
}