Dieses Mal werde ich Ihnen zeigen, wie Sie die Nachrichtendatei (.properties) mit Spring Boot teilen. Wenn Sie spring.messages.basename in application.properties angeben, die durch Kommas getrennt sind, können Sie es in mehrere Dateien aufteilen. Mit zunehmender Anzahl von Dateien wird die Verwaltung jedoch schwierig, sodass Sie Nachrichtendateien in einem bestimmten Ordner dynamisch lesen können. Ich habs gemacht.
Standardmäßig führt Spring Boot die MessageSourceAutoConfiguration-Klasse aus und generiert eine MessageSource-Bean, wenn sich die Nachrichtendatei an dem in spring.messages.basename angegebenen Speicherort befindet. Da wir die MessageSource dieses Mal selbst generieren möchten, werden wir keine resources / messages.properties platzieren. Dies ist der Standardwert von spring.messages.basename.
Erstellen Sie die Config-Klasse mit den folgenden Inhalten. Ich habe es in Kotlin geschrieben, aber in Java ist es dasselbe. In diesem Beispiel wird die Nachrichtendatei in resources / i18n geladen. Es fühlt sich in Bezug auf die Verarbeitung etwas aggressiv an. .. ..
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 {
/**
*Generieren Sie eine Nachrichtenquelle
*/
@Bean
fun messageSource(resourcePatternResolver : ResourcePatternResolver): MessageSource {
val messageSource = ResourceBundleMessageSource()
//Satz von Codierungen(Im Bedarfsfall)
messageSource.setDefaultEncoding(StandardCharsets.UTF_8)
//Andere Einstellungen
/*
messageSource.setFallbackToSystemLocale(xxx)
messageSource.setCacheMillis(xxx)
messageSource.setAlwaysUseMessageFormat(xxx)
messageSource.setUseCodeAsDefaultMessage(xxx)
*/
//Erhalten Sie dynamische Nachrichten
//Rufen Sie eine Liste der Eigenschaftendateien ab, indem Sie ein Muster angeben
resourcePatternResolver.getResources("classpath*:i18n/*.properties")
.filter { it.isFile }.mapNotNull { it.filename }.forEach {
val baseName = if (it.contains("_")) { //Mit Gebietsschema(Im Dateinamen"_"Es ist beinhaltet)
it.substringBeforeLast("_")
} else { //Kein Gebietsschema
it.removeSuffix(".properties")
}
messageSource.addBasenames("i18n/$baseName")
}
}
return messageSource
}
das ist alles.
Es ist ein bisschen aggressiv, aber ich hoffe es hilft. Außerdem war ich besorgt über den Leistungsabfall, wenn die Anzahl der Dateiteile groß war. Daher habe ich mehr als 500 Dateien erstellt und die Zeit für die Nachrichtenerfassung gemessen. Die Nachrichtenabrufzeit erhöhte sich proportional zur Anzahl der Nachrichtendateien nur für den ersten Zugriff, aber nach dem zweiten Zugriff (ein anderer Nachrichtenschlüssel ist ebenfalls möglich) könnte die Nachricht mit hoher Geschwindigkeit abgerufen werden. Ich kann mit der internen Verarbeitung nicht Schritt halten, aber ich denke, sie enthält Cache- oder Look-Ahead-ähnliche Verarbeitung.
Recommended Posts