我目前正在使用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(); }
}
答案 0 :(得分:8)
加载属性文件的方法有很多种。为避免在您的项目中引入任何新依赖项,以下是一些可能对您有帮助的代码段。这只是一种方法......
定义属性文件。我把它放在src / main / resources /中作为&#34; config.properties&#34;
sample.property=i am a sample property
在您的泽西配置文件中(假设您正在使用类扩展应用程序),您可以在那里加载属性文件,它只会在应用程序初始化期间加载一次,以避免您担心执行文件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");
}
}
答案 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;
}