簡體   English   中英

在 Java Jersey RESTful Web 應用程序中加載屬性文件,以在整個應用程序中持續存在?

[英]Loading properties file in a Java Jersey RESTful web app, to persist throughout the app?

我目前正在使用 Jersey 構建一個 RESTful API。 到目前為止,一切都進行得很順利,但是,所有的配置條目都已被硬編碼。(即數據庫主機數據庫用戶名等...)。

我希望能夠設置一個存在於我的WEB-INF文件夾中的config.properties文件來包含所有這些配置規范。

我擔心如果我以“經典”的方式讀取類路徑上的文件,我會為每個請求執行文件 I/O。 我希望能夠在啟動時讀取一次(我知道在我的web.xml文件中涉及一個ServletListener

這是我在下面的內容:

網頁.xml :

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

我想做這樣的事情(我在 StackOverflow 上找到它),但我認為它不一定適用於 Jersey:

配置文件

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(); }
}

有很多方法可以加載屬性文件。 為避免在您的項目中引入任何新的依賴項,以下是一些可能對您有所幫助的代碼片段。 這只是一種方法......

  1. 定義您的屬性文件。 我把我的放在 src/main/resources/ 作為“config.properties”

     sample.property=i am a sample property
  2. 在您的 jersey 配置文件中(假設您正在使用類擴展應用程序),您可以在那里加載屬性文件,並且它只會在應用程序初始化期間加載一次,以避免您擔心一遍又一遍地執行文件 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"); } }

例子:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM