在Java Jersey RESTful Web应用程序中加载属性文件,以在整个应用程序中保留?

时间:2015-04-09 16:08:12

标签: java xml jersey config properties-file

我目前正在使用Jersey构建RESTful API。到目前为止,一切进展顺利,但是,所有配置条目都已经硬编码。(即数据库主机数据库用户名等...)。

我希望能够设置config.properties文件夹中存在的WEB-INF文件,以包含所有这些配置规范。

我担心如果我这样做,经典"在Classpath上读取文件的方法,我为每个请求执行文件I / O.我希望能够在启动时阅读一次(我知道ServletListener文件中包含web.xml

以下是我的内容:

的web.xml

<listener>
    <listener-class>com._1834Software.Config</listener-class>
</listener>

我想做类似的事情(我在StackOverflow上找到here),但我认为它不一定适用于泽西岛:

Config.java

public class Config implements ServletContextListener {
    private static final String ATTRIBUTE_NAME = "config";
    private Properties config = new Properties();

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {

            config.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));

        } catch (IOException err) {
            err.printStackTrace();
        }

        event.getServletContext().setAttribute(ATTRIBUTE_NAME, this);

    }

    @Override
    public void contextDestroyed(ServletContextEvent event) { /**/ }

    public static Config getInstance(ServletContext context) {
        return (Config) context.getAttribute(ATTRIBUTE_NAME);
    }

    public String getProperty(String key) {
        return config.getProperty(key);
    }

}

我试着这样称呼它:

Config config = Config.getInstance(getServletContext());
String property = config.getProperty("HEROKU_DATABASE_URL");

但是我收到以下错误:

Error:(32, 40) java: cannot find symbol
symbol:   method getServletContext()
location: class com._1834Software.database.DatabaseHandler

以下是我试图调用它的文件(DatabaseHandler.java):

public class DatabaseHandler {
    public Connection connection = null;

    Config config = Config.getInstance(getServletContext());
    String property = config.getProperty("somekey");


    /* Database Parameters */
    private String DRIVER = "org.postgresql.Driver";
    private String host = "XXXXX";
    private String userName = "XXXXX";
    private String password = "XXXXX";

    public void connect() throws SQLException {
        try {

            Class.forName(DRIVER);

        } catch (ClassNotFoundException err) {

            err.printStackTrace();   

        }

        try {

            connection = DriverManager.getConnection(host, userName, password);

        } catch (SQLException err) {
            err.printStackTrace();
        }
    }

    public void disconnect() throws SQLException { connection.close(); }
}

2 个答案:

答案 0 :(得分:8)

加载属性文件的方法有很多种。为避免在您的项目中引入任何新依赖项,以下是一些可能对您有帮助的代码段。这只是一种方法......

  1. 定义属性文件。我把它放在src / main / resources /中作为&#34; config.properties&#34;

    sample.property=i am a sample property
    
  2. 在您的泽西配置文件中(假设您正在使用类扩展应用程序),您可以在那里加载属性文件,它只会在应用程序初始化期间加载一次,以避免您担心执行文件I / O一遍又一遍:

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashSet;
    import java.util.Properties;
    import java.util.Set;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("sample")
    public class JerseyConfig extends Application {
    
    public static final String PROPERTIES_FILE = "config.properties";
    public static Properties properties = new Properties();
    
    private Properties readProperties() {
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
        if (inputStream != null) {
            try {
                properties.load(inputStream);
            } catch (IOException e) {
                // TODO Add your custom fail-over code here
                e.printStackTrace();
            }
        }
        return properties;
    }
    
    @Override
    public Set<Class<?>> getClasses() {     
        // Read the properties file
        readProperties();
    
        // Set up your Jersey resources
        Set<Class<?>> rootResources = new HashSet<Class<?>>();
        rootResources.add(JerseySample.class);
        return rootResources;
    }
    
    }
    
  3. 然后,您可以在端点中引用您的属性,如下所示:

    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/")
    public class JerseySample {
    
        @GET
        @Path("hello")
        @Produces(MediaType.TEXT_PLAIN)
        public String get() {
            return "Property value is: " + JerseyConfig.properties.getProperty("sample.property");
        }
    
    }
    

答案 1 :(得分:1)

示例:

private static String token;
static {
    token = getProperties().getProperty("token");
}

public static Properties getProperties() {
    Properties _properties = new Properties();

    try (InputStream inputStream = new FileInputStream("src/main/resources/app.properties")) {
        _properties.load(inputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return _properties;
}