Spring MessageSource的属性文件中的内部引用

时间:2014-03-03 11:39:04

标签: spring spring-mvc internationalization

我有几个网页上有类似的表格。

多个页面中存在的一个字段是电子邮件地址。

我希望能够使用特定于页面的消息代码,但我希望能够引用另一个消息代码以获得单个声明。通过这种方式,我可以在一个地方更改电子邮件地址标签的外观,并在所有网页中更改它,但同时,我可以更改仅包含属性文件更新的单个页面的文本。 / p>

我正在寻找这样的功能:

message.properties:

label.email=Email address

webpage1.label.email=${label.email}
webpage2.label.email=${label.email}

然而, 使用以下jsp代码时:

<spring:message code="webpage1.label.email"/>

我的网页上有文字$ {label.email}而不是“电子邮件地址”。

任何提示?

1 个答案:

答案 0 :(得分:2)

您可以使用以下内容替换DefaultPropertiesPersister:

这将允许您引用其他条目,例如:

user=User
user.add=Add ${user}
user.delete=Delete ${user}

只需使用MessageSource指定此持久性,例如messageSource.setPropertiesPersister(new RecursivePropertiesPersister());

来源:

public class RecursivePropertiesPersister extends DefaultPropertiesPersister {
    private final static Pattern PROP_PATTERN = Pattern.compile("\\$'?\\{'?([^}']*)'?\\}'?");
    private final static String CURRENT = "?LOOP?";

    @Override
    public void load(Properties props, Reader reader) throws IOException {
        Properties propsToLoad = new Properties();
        super.load(propsToLoad, reader);
        replace(propsToLoad, props);
    }

    @Override
    public void load(Properties props, InputStream is) throws IOException {
        Properties propsToLoad = new Properties();
        super.load(propsToLoad, is);
        replace(propsToLoad,props);
    }

    protected void replace ( Properties src, Properties dest) {
        for (Map.Entry entry: src.entrySet()) {
            String key = (String) entry.getKey();
            String value = (String)entry.getValue();
            replace(src, dest, key, value);
        }
    }

    protected String replace(Properties src, Properties dest, String key, String value) {
        String replaced = (String) dest.get(key);
        if (replaced != null) {
            // already replaced (or loop), just return the string
            return replaced;
        }
        dest.put(key,CURRENT); // prevent loops
        final Matcher matcher = PROP_PATTERN.matcher(value);
        final StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            final String subkey = matcher.group(1);
            final String replacement = (String)src.get(subkey);
            matcher.appendReplacement(sb,replace(src,dest,subkey,replacement));
        }
        matcher.appendTail(sb);
        final String resolved = sb.toString();
        dest.put(key, resolved);
        return resolved;
    }
}