/ Startseite / Blog / Technologisch

Thymeleaf Boilerplate

Gradle-Dependencies:

compile group: 'org.projectlombok', name: 'lombok', version: '1.18.16'
annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.16'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '2.14.0'
compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.12.3'
compile group: 'org.thymeleaf', name: 'thymeleaf', version: '3.0.12.RELEASE'
compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-java8time', version: '3.0.4.RELEASE'
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'

Boilerplate-Implementierung einer generischen Renderer-Klasse:

import lombok.Data;
import lombok.NonNull;
import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.time.DurationFormatUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.context.IContext;
import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect;
import org.thymeleaf.messageresolver.StandardMessageResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.Instant;
import java.util.Locale;
import java.util.Objects;

@Log4j2
@Data
public class TemplateRenderer {

    private final TemplateEngine templateEngine;

    public TemplateRenderer() {
        ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver();
        classLoaderTemplateResolver.setSuffix( ".html" );
        classLoaderTemplateResolver.setPrefix( "/templates" );
        classLoaderTemplateResolver.setTemplateMode( TemplateMode.HTML );
        classLoaderTemplateResolver.setCharacterEncoding( StandardCharsets.UTF_8.name() );

        templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver( classLoaderTemplateResolver );

        StandardMessageResolver messageResolver = new StandardMessageResolver();
        templateEngine.setMessageResolver( messageResolver );

        templateEngine.addDialect( new Java8TimeDialect() );
    }

    public String render( @NonNull String view ) {
        return render( view, null, null );
    }

    public String render( @NonNull String view, Locale locale, Instant now ) {
        Context context = new Context();
        Locale appliedLocale = Objects.requireNonNullElseGet( locale, Locale::getDefault );
        Instant appliedNow = Objects.requireNonNullElseGet( now, Instant::now );

        context.setLocale( appliedLocale );
        context.setVariable( "now", appliedNow );
        return render( view, context );
    }

    @SneakyThrows
    public String render( @NonNull String view, @NonNull IContext context ) {
        return templateEngine.process( view, context );
    }

    public static String formatDuration( @NonNull Duration duration ) {
        return DurationFormatUtils.formatDuration( duration.toMillis(), "dd 'd' HH:mm" );
    }
}

Posted in Technologisch on Mai 26, 2021