gpt4 book ai didi

java - 在 Java Jersey RESTful Web 应用程序中加载属性文件,以在整个应用程序中持续存在?

转载 作者:数据小太阳 更新时间:2023-10-29 02:01:30 25 4
gpt4 key购买 nike

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

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

我担心如果我以“经典”方式读取类路径上的文件,我会为每个请求执行文件 I/O。我希望能够在启动时读取一次(我知道这涉及到我的 web.xml 文件中的 ServletListener

下面是我的内容:

web.xml:

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

我想做这样的事情(我在 StackOverflow 上找到了 here),但我认为它不一定适用于 Jersey:

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

最佳答案

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

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

    }

关于java - 在 Java Jersey RESTful Web 应用程序中加载属性文件,以在整个应用程序中持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29543597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com