1

春に私は自分自身を実装しており、HTML レイヤーで欠落しているキーを管理するReloadableResourceBundleMessageSourceメソッドをオーバーライドしています。resolveCodeWithoutArguments()それは非常にうまく機能します。問題は、Javaレイヤーでメソッドを使用したい場合です

getMessage(String code, Object[] args, String defaultMessage, Locale locale)

そのメソッドは、プロパティ ファイルから の説明codeを取得しません。args

  • 誰かが私が欠けているものを知っていますか?

  • さらに情報が必要ですか?

豆の定義

<bean id="messageSource" class="com.package.CustomResourceBundle">
    <property name="defaultEncoding" value="UTF-8" />
    <property name="fileEncodings" value="UTF-8"/>
    <property name="cacheSeconds" value="5" />
    <property name="basenames" value="i18n/messages,i18n/support"/>
</bean>

メソッド getMessage() を使用しているメソッド

public static String getBundleMessage(RequestContext context, String key, Object params[]) {

    ApplicationContext appContext = context.getActiveFlow().getApplicationContext();
    DelegatingMessageSource messageSource = (DelegatingMessageSource)appContext.getBean("messageSource");
    messageSource.setAlwaysUseMessageFormat(true);

    return messageSource.getMessage(key, params, "[ "+key+" ]" ,LocaleContextHolder.getLocale());

    }

財産

report_date=Report Date: {0}

CustomResourceBundle クラス

public class CustomResourceBundle extends ReloadableResourceBundleMessageSource {

    private String[] basenames = new String[0];
    private long cacheMillis = -1;

    @Override
    public void setCacheSeconds(int cacheSeconds) {
        this.cacheMillis = (cacheSeconds * 1000);
    }

    @Override
    public void setBasenames(String... basenames) {
        if (basenames != null) {
            this.basenames = new String[basenames.length];
            for (int i = 0; i < basenames.length; i++) {
                String basename = basenames[i];
                Assert.hasText(basename, "text");
                this.basenames[i] = basename.trim();
            }
        } else {
            this.basenames = new String[0];
        }
    }

    @Override
    protected String resolveCodeWithoutArguments(String code, Locale locale) {
        if (this.cacheMillis < 0) {
            PropertiesHolder propHolder = getMergedProperties(locale);
            String result = propHolder.getProperty(code);
            if (result != null) {
                return result;
            }
        } else {
            for (String basename : this.basenames) {
                List<String> filenames = calculateAllFilenames(basename, locale);
                for (String filename : filenames) {
                    PropertiesHolder propHolder = getProperties(filename);
                    String result = propHolder.getProperty(code);
                    if (result != null) {
                        return result;
                    }
                }
            }
        }
        return "[ "+code+" ]";
    }

}

更新 - 解決策 メソッドがうまく機能しない理由が見つからなかったので、メソッドを実装しました。

public static String getResourceBundleMessage(RequestContext context, String key, Object[] params) {

        String finalMsg = "";
        MessageFormat messageFormat = null;

        ApplicationContext appContext = context.getActiveFlow().getApplicationContext();        
        DelegatingMessageSource  messageSource = (DelegatingMessageSource) appContext.getBean("messageSource");

        String  msgValue = messageSource.getMessage(key, null, "[ "+key+" ]", LocaleContextHolder.getLocale());
        messageFormat = new MessageFormat(msgValue);

        if(!msgValue.equalsIgnoreCase("[ "+key+" ]")){
            finalMsg = messageFormat.format(params);
        }           

        return finalMsg;

    }
4

0 に答える 0