メッセージリソースの変更を即時反映させる
S2ContainerでHOT deployを有効にしていても、ResourceBundleの中身はキャッシュされていて、コンテナを再起動しないとpropertiesファイルに加えた変更が反映されません。
これだと開発時に不便なので、CubbyでHOT deploy中に、messages.propertiesの変更を即時反映してメッセージを取得できるようにしてみました。Java 6限定です。
import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import org.seasar.cubby.CubbyConstants; import org.seasar.cubby.action.Action; import org.seasar.cubby.controller.ThreadContext; import org.seasar.cubby.controller.impl.DefaultMessagesBehaviour; import org.seasar.framework.container.hotdeploy.HotdeployUtil; public abstract class ActionBase extends Action { private Map<String, String> messages; public Map<String, String> getMsg() { if (!HotdeployUtil.isHotdeploy()) { return ThreadContext.getMessagesMap(); } if (messages == null) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); ResourceBundle.clearCache(loader); ResourceBundle bundle = ResourceBundle.getBundle( CubbyConstants.RES_MESSAGES, Locale.getDefault(), loader); messages = new DefaultMessagesBehaviour().toMap(bundle); } return messages; } }
上記のActionBaseをアクションの基底クラスにしておき、テンプレート側では${messages['key']}の代わりに${msg['key']}と記述してメッセージを取得するようにします。