simplelenz
simplelenz

Reputation: 947

Render a fragment of a html in Thymeleaf from an external server

I have my homepage in my spring boot project called home.html. I have a pages controller to render this home.html. Below is the code of the controller.

@RequestMapping(value = "/home")
public String goToHome(Model model) {
    return "home";
}

In my project home.html is inside webapp/WEB-INF/static/ folder. so the path is webapp/WEB-INF/static/home.html

My home.html looks like below

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/html">
<head>
     <title>home</title>
</head>
<body>
    <object th:include="/en/home :: home-body" th:remove="tag"/>
</body>
</html>

I have home.html file in an external server as follows.

<div th:fragment="home-body">
    <p>Welcome to home page</p>
</div>

The path to this file is http://external-server.com/fragments/en/home.html

What I want to do is to render this home-body fragment part fetching from this external server inside the home.html residing in spring boot tomcat server.

I added the below Bean as a configuration to fetch this home-body fragment. Below is the code for that.

@Bean
    public UrlTemplateResolver urlTemplateResolver(){
        UrlTemplateResolver urlTemplateResolver = new UrlTemplateResolver();
        boolean isCmsContentEnable = Boolean.parseBoolean( env.getProperty( ConfigurationConstants.CMS_CONTENT_ENABLE ) );
        if( isCmsContentEnable )
        {
            urlTemplateResolver.setPrefix( "http://external-server.com/fragments/" );
            urlTemplateResolver.setSuffix( ".html" );
            urlTemplateResolver.setCharacterEncoding( "UTF-8" );
            urlTemplateResolver.setTemplateMode( "HTML5" );
            urlTemplateResolver.setCacheable( false );
            urlTemplateResolver.setOrder(10);
        }
        return urlTemplateResolver;
    }

Now when I try to go to home page, what happens is instead of rendering the home-body fragment inside the home.html residing in the spring boot tomcat server, it directly renders the home.html residing in the external server.

How can I fix this issue? Can anyone point out what I am doing wrong here. Thanks

Upvotes: 1

Views: 1642

Answers (1)

Supun Dharmarathne
Supun Dharmarathne

Reputation: 1148

Create SpringTemplateEngine with thymeleafTemplateResolver and urlTemplateResolver as templateResolvers.

   @Bean public ThymeleafViewResolver thymeleafViewResolver()
{
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine( templateEngine() );
    return viewResolver;
}

@Bean public SpringTemplateEngine templateEngine()
{
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    Set<ITemplateResolver> templateResolvers = new HashSet();
    templateResolvers.add( thymeleafTemplateResolver() );
    templateResolvers.add( urlTemplateResolver() );
    templateEngine.setTemplateResolvers( templateResolvers );

    return templateEngine;
}

@Bean public SpringResourceTemplateResolver thymeleafTemplateResolver()
{
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setPrefix( "/WEB-INF/static/" );
    templateResolver.setSuffix( ".html" );
    templateResolver.setTemplateMode( "HTML5" );
    templateResolver.setOrder( 2 );
    return templateResolver;
}

@Bean public UrlTemplateResolver urlTemplateResolver()
{
    UrlTemplateResolver urlTemplateResolver = new UrlTemplateResolver();
    urlTemplateResolver.setCharacterEncoding( "UTF-8" );
    urlTemplateResolver.setTemplateMode( "HTML5" );
    urlTemplateResolver.setCacheable( false );
    urlTemplateResolver.setOrder( 3 );
    return urlTemplateResolver;
}

Then access the external template like this.

 <div th:include="http://banner.server.com/myBanner.html :: fragmentName">

Upvotes: 1

Related Questions