Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Migration of thymeleaf version 2.14 to 3.0 not finding message properties

Thymeleaf version 2.14 was picking up message.properties file correctly. After migration to 3.0,it is giving error ??hello.MESSAGE_en_US??. But in javacode by autowiring messsagesource

messageSource.getMessage( "hello.MESSAGE",null, Locale.getDefault()) ->Hello App

The project structure

 src/main/
       -java
          -com.cando
            -controllers
       -resources
         -messages_en.properties
         -spring.properties
       -webapp
         -WEB-INF
           -templates
             -index.html

index.html

<!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
        <head>
            <title>Helllo</title>
        </head>
        <body>
            <p th:text="#{hello.MESSAGE}">Hello App!</p>
        </body>
    </html>

messages_en.properties

hello.MESSAGE=Hello App

config

   @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
        resourceBundleMessageSource.setBasename("messages");
        resourceBundleMessageSource.setBasename("spring");
        return resourceBundleMessageSource;
    }
like image 396
arun kumar Avatar asked Dec 05 '25 07:12

arun kumar


2 Answers

In your config file you setBasename() to messages and then override value to spring. I think ResourceBundleMessageSource just doesn't see your messages file, and you should add it like: setBasenames("messages","spring"). Give it a try and tell if it works :)

like image 81
Iwo Kucharski Avatar answered Dec 07 '25 01:12

Iwo Kucharski


I think i found solution

While you configure SpringTemplateEngine it's possible to explicitly set messageSource and messageResolver.

For me, this works.

My code in kotlin:

@Configuration
@ComponentScan
open class ThymeleafConfig {

   @Autowired
   lateinit var applicationContext: ApplicationContext

   @Autowired
   lateinit var messageSource: MessageSource

   @Autowired
   lateinit var messageResolver: SpringMessageResolver

   @Bean
   open fun viewResolver(): ViewResolver = ThymeleafViewResolver().apply     
   {
       templateEngine = templateEngine()
       characterEncoding = "UTF-8"
   }


   fun templateEngine(): TemplateEngine = SpringTemplateEngine().apply {
       enableSpringELCompiler = true
       setTemplateResolver(templateResolver())
       setMessageSource(messageSource)
       addMessageResolver(messageResolver)
   }

   fun templateResolver(): ITemplateResolver = SpringResourceTemplateResolver().apply {
       prefix = "file:./web/templates/"
       suffix = ".html"
       templateMode = TemplateMode.HTML
       cacheTTLMs = 0
       isCacheable = false
       setApplicationContext(applicationContext)
   }
}

@Component
class MessageResolverImpl: SpringMessageResolver() {    }

and messageSource bean:

@Bean
open fun messageSource(): MessageSource {
    val source = ReloadableResourceBundleMessageSource()
    source.setBasename("classpath:messages")
    source.setUseCodeAsDefaultMessage(true)
    source.setDefaultEncoding("UTF-8")
    return source
}

Hope this will help you

like image 29
kurt Avatar answered Dec 07 '25 00:12

kurt