加载Web应用程序属性

时间:2018-09-13 17:38:29

标签: java web-applications

当我通过maven构建项目时,可以,但是在Tomkat进行部署时,我会遇到NullPointerException。 类,哪里可能出问题-PropertiesManager。 日志行:PropertiesManager.getApplicationProperties(PropertiesManager.java:31)

public class PropertiesManager {
    private static final String PROPERTY_FILE_NAME =
            "resources/application.properties";
    private static PropertiesManager Instance;
    private Properties properties;

    private PropertiesManager() {
    }

    public static PropertiesManager getInstance() {
        if (Instance == null) {
            Instance = new PropertiesManager();
        }
        return Instance;
    }

    public Properties getApplicationProperties() {
        if (properties == null) {
            properties = new Properties();
            try (InputStream stream = Thread.currentThread()
                    .getContextClassLoader()
                    .getResourceAsStream(PROPERTY_FILE_NAME)) {
                properties.load(stream);
            } catch (IOException e) {
                throw new ApplicationException("Failed to load property file", e);
            }
        }
        return properties;
    }
}

和日志行:ApplicationLifecycleListener.contextInitialized(ApplicationLifecycleListener.java:14) 类ApplicationLifecycleListener:

public class ApplicationLifecycleListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        Properties applicationProperties = PropertiesManager.getInstance().getApplicationProperties();
        DBManager.getInstance().initialize(applicationProperties);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        DBManager.getInstance().stopDb();
    }
}

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

如果没有为文件提供确切的行,您将看到NullPointerException(您提供的所有文件都没有日志中显示的行),则很难确定。但是有一个提示是,尽管您将要使用Maven构建的资源文件放在'<project>/src/main/resources'文件夹中,但是在构建和打包war文件时,它将把您的应用程序资源文件放在'WEB-INF/classes'文件夹中,即应用程序默认类路径的一部分。因此,要使用方法Thread.currentThread().getContextClassLoader().getResourceAsStream(...)正确引用它们,您不应在文件名中添加'resources\...'前缀,因为此方法已经在默认应用程序类路径中查找文件。删除前缀,看看它是否有效。请参考此answer以获得更多详细信息。