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" );
}
}