Is there a way to make Spring Thymeleaf process a string template?

后端 未结 4 1626
-上瘾入骨i
-上瘾入骨i 2020-12-14 11:00

I would like to write something like :

    @Autowired
    private SpringTemplateEngine engine;
....
  // Thymeleaf Context
  WebContext thymeleafContext = ne         


        
4条回答
  •  不知归路
    2020-12-14 11:29

    The solution we ended up using consisted of a new IResourceResolver with a custom Context rather than a custom TemplateResolver. We chose this because we still wanted to use classpath scanning in most cases, but occasionally had dynamic content.

    The following shows how we did it:

    public class StringAndClassLoaderResourceResolver implements IResourceResolver {
    
    
        public StringAndClassLoaderResourceResolver() {
            super();
        }
    
    
        public String getName() {
            return getClass().getName().toUpperCase();
        }
    
    
        public InputStream getResourceAsStream(final TemplateProcessingParameters params, final String resourceName) {
            Validate.notNull(resourceName, "Resource name cannot be null");
            if( StringContext.class.isAssignableFrom( params.getContext().getClass() ) ){
                String content = ((StringContext)params.getContext()).getContent();
                return IOUtils.toInputStream(content);
            }
            return ClassLoaderUtils.getClassLoader(ClassLoaderResourceResolver.class).getResourceAsStream(resourceName);
        }
    
        public static class StringContext extends Context{
    
            private final String content;
    
            public StringContext(String content) {
                this.content = content;
            }
    
            public StringContext(String content, Locale locale) {
                super(locale);
                this.content = content;
            }
    
            public StringContext(String content, Locale locale, Map variables) {
                super(locale, variables);
                this.content = content;
            }
    
            public String getContent() {
                return content;
            }
        }
    

    Test Case

    public class StringAndClassLoaderResourceResolverTest {
    
        private static SpringTemplateEngine templateEngine;
    
        @BeforeClass
        public static void setup(){
            TemplateResolver resolver = new TemplateResolver();
            resolver.setResourceResolver(new StringAndClassLoaderResourceResolver());
            resolver.setPrefix("mail/"); // src/test/resources/mail
            resolver.setSuffix(".html");
            resolver.setTemplateMode("LEGACYHTML5");
            resolver.setCharacterEncoding(CharEncoding.UTF_8);
            resolver.setOrder(1);
    
            templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(resolver);
        }
    
        @Test
        public void testStringResolution() {
            String expected = "
    dave
    "; String input = "
    Some Username Here!
    "; IContext context = new StringAndClassLoaderResourceResolver.StringContext(input); context.getVariables().put("userName", "dave"); String actual = templateEngine.process("redundant", context); assertEquals(expected, actual); } @Test public void testClasspathResolution(){ IContext context = new Context(); context.getVariables().put("message", "Hello Thymeleaf!"); String actual = templateEngine.process("dummy", context); String expected = "

    Hello Thymeleaf!

    "; assertEquals(expected, actual); } }

    Dummy template file at src/main/resources/mail/dummy.html

    A message will go here!

    Note: We used Apache CommonsIO's IOUtils for converting the String to an InputStream

提交回复
热议问题