[英]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(); }
}
有很多方法可以加載屬性文件。 為避免在您的項目中引入任何新的依賴項,以下是一些可能對您有所幫助的代碼片段。 這只是一種方法......
定義您的屬性文件。 我把我的放在 src/main/resources/ 作為“config.properties”
sample.property=i am a sample property
在您的 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; } }
然后,您可以在端點中引用您的屬性,如下所示:
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.