Mushtaq Jameel
Mushtaq Jameel

Reputation: 7083

Thymeleaf - Strict HTML parsing issue

HTML5 allows some tags to be written more liberally i.e without corresponding END tags. e.g. input need not be closed </input>.However if choose template mode HTML5 in Thymeleaf the Thymeleaf engine complains about this and does not parse the HTML template. I want to override this default Strict tag checking behavior. i.e Thymeleaf should parse an HTML template with meta and input (AND ALIKE) tags WITHOUT THEIR RESP. CLOSING TAGS. Pl. guide.

It also complains when you have something like this

<a href="/home/pic/image.png" download="/path/to/file" data-gallery></a>

It throws an exception when it encounters the data-gallery throws "should be followed by '=' " which is kind of annoying as it takes the flexibility out of HTML5.

Upvotes: 24

Views: 18044

Answers (3)

michal.jakubeczy
michal.jakubeczy

Reputation: 9517

Using LEGACYHTML5 worked for me as well.

Also it is necessary to add

<dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
</dependency>

to pom.xml as stated above. But there is one more step which might occur. After doing those two steps I was getting:

java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

To avoid this it is necessary to add

<dependency> 
    <groupId>xml-apis</groupId>
    <artifactId>xml-apis</artifactId>
    <version>1.4.01</version>
</dependency>

to pom.xml

Upvotes: 1

VK321
VK321

Reputation: 5963

Here is how you can do it in a neat way

Step 1: Add thymeleaf mode to your application.properties file.

resources/application.properties

spring.thymeleaf.mode=LEGACYHTML5

Step 2: Add nekohtml dependency to your pom.xml file.

pom.xml

<dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
</dependency>

Upvotes: 4

Mushtaq Jameel
Mushtaq Jameel

Reputation: 7083

All you have to do is run Thymeleaf in "LEGACYHTML5" mode and it works like a charm. Thanks to this and this post, I found the solution and am documenting in SO so others do not have to go through the same trouble in finding this answer.

To set the legacy mode you can define the bean in your Spring XML file:

<!-- View TemplateResolver -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <property name="templateMode" value="LEGACYHTML5"/>
    <property name="cacheable" value="false"/>
</bean>

or add the properties to the application.properties file:

spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.cache=false

And in both cases you have to add the nekohtml jar to your project or, if you are running maven, you can add its dependency to your pom.xml

<dependency>
     <groupId>net.sourceforge.nekohtml</groupId>
     <artifactId>nekohtml</artifactId>
     <version>1.9.21</version>
 </dependency>

Gradle

'net.sourceforge.nekohtml:nekohtml:1.9.21'

Upvotes: 60

Related Questions