一尘不染

Tomcat中未获取外部化的message.properties文件

tomcat

根据我的要求,我需要外部化message.properties文件(从war文件中保留外部),同时应在更新时自动重新加载该文件。

因此,通过遵循代码及其在Jetty Server上的正常工作,我既实现了目标。但是,当我使用Tomcat
Server时,外部属性文件不会被系统接收,而是在战争中仅使用该文件。

public final class Messages
{
    public static final String BUNDLE_NAME = "com.sample.project.core.ui.resources.messages";
    //    private static ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
    private static ResourceBundle resourceBundle;
    private static final Logger LOGGER = Logger.getLogger(Messages.class);

    private static ReloadableResourceBundleMessageSource messageSource;

    static
    {
        try
        {
            FileInputStream fis =
                new FileInputStream(System.getProperty("resources.messages.file.path"));
            resourceBundle = new PropertyResourceBundle(fis);
        }
        catch (FileNotFoundException e)
        {
            LOGGER.error("messages.properties file not found: " + e);
            resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
        }
        catch (Exception e)
        {
            LOGGER.error("messages.properties file reading failed: " + e);
            resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
        }

    }

    private Messages()
    {
    }

    /**
     * <p>
     * setter methos to ReloadableResourceBundleMessageSource object.
     * </p>
     * 
     * 
     * @param inMessageSource
     *            set reloadable resources bundle
     **/
    public static void setMessageSource(final ReloadableResourceBundleMessageSource inMessageSource)
    {
        Messages.messageSource = inMessageSource;
        Messages.messageSource.setBasename(System.getProperty("resources.messages.file.path"));
    }

    /**
     * <p>
     * Resolve a message by a key and argument replacements.
     * </p>
     * 
     * @see MessageFormat#format(String, Object...)
     * @param key
     *            the message to look up
     * @param arguments
     *            optional message arguments
     * @return the resolved message
     **/
    public static String getMessage(final String key, final Object... arguments)
    {
        try
        {
            if (messageSource != null)
            {
                return messageSource.getMessage(key, arguments, Locale.getDefault());
            }
            else
            {
                if (arguments != null)
                    return MessageFormat.format(resourceBundle.getString(key), arguments);
                return resourceBundle.getString(key);
            }
        }
        catch (NoSuchMessageException e)
        {
            LOGGER.error("Message key not found: " + key);
            return '!' + key + '!';
        }
        catch (MissingResourceException e)
        {
            LOGGER.error("Message key not found: " + key);
            return '!' + key + '!';
        }
    }

}

(这是我使用“ resources.messages.file.path”键作为VM参数传递的文件路径)

首先,我认为访问文件系统存在问题,并尝试了许多方法。然后,我听说了catalina.policy文件,并添加了一些类似这样的行。

grant codeBase "file:${catalina.base}/webapps/sample.war/-" {
    permission java.security.AllPermission;
    permission java.io.FilePermission "file:${catalina.base}${file.separator}webapps${file.separator}messages.properties", "read, write";

    permission java.util.PropertyPermission "resources.messages.file.path", "read";
}

但是他们都不给我带来好运。我很绝望。知道这个问题是什么吗?请帮我。先感谢您。(在Tomcat6上测试)


阅读 337

收藏
2020-06-16

共1个答案

一尘不染

终于,我找到了搞砸的地方。

这的setter方法messageSource不应该是 静态的 ,我 删除静态访问messageSource

    messageSource = inMessageSource;
    messageSource.setBasename(System.getProperty("resources.messages.file.path"));

现在代码可以正常工作了。并且 不需要catalina.policy文件中的该权限条目。 感谢所有帮助我的人。

2020-06-16