Spring boot で application.properties の spring.messages.basename を使わずに国際対応をした感出したい
やりたいことは、application.properties の spring.messages.basename を使わずに国際対応をしたい。前々回辺りに書いた ValidationMessages.properties を流用したい。つまり、デフォルトの機能を使わずになんとか楽したい。
ResourceBundleMessageSource を使う場合。
ReloadableResourceBundleMessageSource (Spring Framework 4.2.2.RELEASE API)
問題はこのResourceBundleMessageSource がUTF-8ではなく、ISO-8859-1で文字列を持ってくる点だけど、よく考えたら変換すればいいだけだった。
import java.util.Locale;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Service;
@Service
public class I18nMessageService
{
private final String VALID_MSG_FILE = "i18n/ValidationMessages";
private ResourceBundleMessageSource validRb;
public I18nMessageService()
{
validRb = new ResourceBundleMessageSource();
validRb.setBasename( VALID_MSG_FILE );
}
public String getValidationMsg( String propStr, Locale locale )
{
String msg = validRb.getMessage( propStr, null, locale);
return toUtf8( msg );
}
private String toUtf8( String str8859 )
{
String strUtf8 = str8859;
try {
strUtf8 = new String( str8859.getBytes( "ISO-8859-1" ), "UTF-8" );
}catch ( Exception e ){
}
return strUtf8;
}
}
ここでファイルへのパスに前回同様「classpath:」で指定するのかな、と思って入れてみたら動かなかった。なんでなんだ・・・?
じゃあ、前回と同様に ReloadableResourceBundleMassageSource使えばいいんじゃね。
import java.util.Locale;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
@Service
public class I18nMessageService
{
private final String VALID_MSG_FILE = "classpath:i18n/ValidationMessages";
private MessageSource validMs;
public I18nMessageService()
{
validMs = getMessageSource( VALID_MSG_FILE );
}
public String getValidationMsg( String propStr, Locale locale )
{
return validMs.getMessage( propStr, null, "", locale );
}
private MessageSource getMessageSource( String filePath )
{
ReloadableResourceBundleMessageSource validRb = new ReloadableResourceBundleMessageSource();
validRb.setBasename( filePath );
validRb.setDefaultEncoding( "UTF-8" );
return validRb;
}
}
こちらも動いた。こちらは「classpath」付き。うーん。