Cette fois, je vais vous montrer comment diviser le fichier de message (.properties) avec Spring Boot. Si vous spécifiez spring.messages.basename dans application.properties séparés par des virgules, vous pouvez le diviser en plusieurs fichiers, mais à mesure que le nombre de fichiers augmente, la gestion devient difficile, vous pouvez donc lire dynamiquement les fichiers de messages dans un dossier spécifique. Je l'ai fait.
Par défaut, Spring Boot exécute la classe MessageSourceAutoConfiguration et génère un bean MessageSource si le fichier de message se trouve à l'emplacement spécifié dans spring.messages.basename. Puisque nous voulons générer nous-mêmes le MessageSource cette fois, ne placez pas resources / messages.properties, qui est la valeur par défaut de spring.messages.basename.
Créez la classe Config avec le contenu suivant. Je l'ai écrit en Kotlin, mais c'est la même chose en Java. Cet exemple charge le fichier de message dans resources / i18n. Cela semble un peu agressif en termes de traitement. .. ..
AppConfig.kt
package ...
import org.springframework.context.MessageSource
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.support.ResourceBundleMessageSource
import org.springframework.core.io.support.ResourcePatternResolver
import org.springframework.util.StringUtils
import java.nio.charset.StandardCharsets
@Configuration
class AppConfig {
/**
*Générer une source de message
*/
@Bean
fun messageSource(resourcePatternResolver : ResourcePatternResolver): MessageSource {
val messageSource = ResourceBundleMessageSource()
//Ensemble d'encodages(Si nécessaire)
messageSource.setDefaultEncoding(StandardCharsets.UTF_8)
//Autres réglages
/*
messageSource.setFallbackToSystemLocale(xxx)
messageSource.setCacheMillis(xxx)
messageSource.setAlwaysUseMessageFormat(xxx)
messageSource.setUseCodeAsDefaultMessage(xxx)
*/
//Recevez des messages dynamiques
//Obtenez une liste de fichiers de propriétés en spécifiant un modèle
resourcePatternResolver.getResources("classpath*:i18n/*.properties")
.filter { it.isFile }.mapNotNull { it.filename }.forEach {
val baseName = if (it.contains("_")) { //Avec locale(Dans le nom du fichier"_"C'est inclus)
it.substringBeforeLast("_")
} else { //Pas de paramètres régionaux
it.removeSuffix(".properties")
}
messageSource.addBasenames("i18n/$baseName")
}
}
return messageSource
}
c'est tout.
C'est un peu agressif, mais j'espère que cela aide. De plus, j'étais préoccupé par la dégradation des performances lorsque le nombre de divisions de fichiers était important, j'ai donc créé plus de 500 fichiers et mesuré le temps d'acquisition des messages. Le temps de récupération des messages augmentait proportionnellement au nombre de fichiers de messages uniquement pour le premier accès, mais après le deuxième accès (une autre clé de message est également possible), le message pouvait être récupéré à grande vitesse. Je ne peux pas suivre le traitement interne, mais je pense qu'il contient un cache ou un traitement de type anticipé.
Recommended Posts