1

So i'm trying to generate a pdf file from a thymeleaf template but I get this error when running my app.

***************************
APPLICATION FAILED TO START
***************************

Description:

Field templateEngine in com.example.app.service.PdfService required a bean of type 'org.thymeleaf.TemplateEngine' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.thymeleaf.TemplateEngine' in your configuration.


Process finished with exit code 0

HERE IS HOW MY APPLICATION LOOKS LIKE. Everything looks correct and I don't know what i've done wrong

my configuration file :

@Configuration
public class ThymeleafConfig {

    @Bean
    public ClassLoaderTemplateResolver templateResolver() {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setPrefix("templates/");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("XHTML");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setOrder(1);
        return templateResolver;
    }
}

my PdfService :

@Service
public class PdfService {

    @Autowired
    private TemplateEngine templateEngine;

    public void createPDF() throws DocumentException, IOException {
        Context context = new Context();
        context.setVariable("name","developper.com");
        String processHtml = templateEngine.process("helloworld",context);
        OutputStream outputStream = new FileOutputStream("message.pdf");
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(processHtml);
        renderer.layout();
        renderer.createPDF(outputStream,false);
        renderer.finishPDF();
        outputStream.close();
    }
}

my main app :

@Bean
    CommandLineRunner run(PdfService pdfService) {

        return args -> {

            System.out.println("creating pdf...");
            pdfService.createPDF();
            System.out.println("pdf creation complete!");
       
        };
    }

EDIT : i managed to overcome the problem, but now i've been hit with another error :

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:772) ~[spring-boot-2.6.3.jar:2.6.3]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:753) ~[spring-boot-2.6.3.jar:2.6.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:309) ~[spring-boot-2.6.3.jar:2.6.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.6.3.jar:2.6.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.6.3.jar:2.6.3]
    at com.example.app.AppApplication.main(AppApplication.java:35) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.3.jar:2.6.3]
Caused by: org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TrAX transformer). org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.transform(XMLResource.java:222) ~[flying-saucer-core-9.1.4.jar:na]
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:181) ~[flying-saucer-core-9.1.4.jar:na]
    at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:84) ~[flying-saucer-core-9.1.4.jar:na]
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocumentFromString(ITextRenderer.java:161) ~[flying-saucer-pdf-itext5-9.1.4.jar:na]
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocumentFromString(ITextRenderer.java:156) ~[flying-saucer-pdf-itext5-9.1.4.jar:na]
    at com.example.app.service.PdfService.createPDF(PdfService.java:28) ~[classes/:na]
    at com.example.app.AppApplication.lambda$run_again$1(AppApplication.java:74) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:769) ~[spring-boot-2.6.3.jar:2.6.3]
    ... 10 common frames omitted
Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:794) ~[na:na]
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:397) ~[na:na]
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.transform(XMLResource.java:220) ~[flying-saucer-core-9.1.4.jar:na]
    ... 17 common frames omitted
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1251) ~[na:na]
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:695) ~[na:na]
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:782) ~[na:na]
    ... 19 common frames omitted
blabla blabla
  • 169
  • 12
  • 1
    I guess you need a dependecy for template. Application can not autowired TemplateEngine – Gurkan İlleez Jun 14 '22 at 12:56
  • What dependencies does your application have? Spring Boot can auto-configure a `org.thymeleaf.spring5.SpringTemplateEngine` (it extends `TemplateEngine`) bean but this requires a dependency on `thymeleaf-spring5`. – Andy Wilkinson Jun 14 '22 at 13:21

2 Answers2

1

In configuration class, you need to create template engine bean and set template resolver which you have created:

  @Bean
        public SpringTemplateEngine templateEngine() {
            var templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver());
    
            return templateEngine;
        }

NOTE: TemplateEngine bean is not autoconfigured.

Nemanja
  • 3,295
  • 11
  • 15
0

TemplateEngine is not autoconfigured, so you need to add to your configuration something like (remember to set the TemplateResolvers)

@Bean
public TemplateEngine templateEngine() {
  return new TemplateEngine(); 
}

or alternatively, you can just inject it in the service via

final TemplateEngine templateEngine = new TemplateEngine();
dcolazin
  • 831
  • 1
  • 10
  • 25