Загрузка файла свойств в веб-приложение Java Jersey RESTful, чтобы сохранить его в приложении?
В настоящее время я создаю RESTful API, используя Джерси. До сих пор все шло хорошо, однако все записи конфигурации были жестко запрограммированы. (Т. Е. Узелбазы данных, имя пользователя базы данных и т. Д.).
Я хотел бы иметь возможность настроить config.properties
файл, который существует в моем WEB-INF
папка для хранения всех этих спецификаций конфигурации.
Я обеспокоен тем, что если я делаю это "классическим" способом чтения файла в Classpath, я выполняю файловый ввод / вывод для каждого запроса. Я хочу иметь возможность прочитать один раз при запуске (который я знаю, включает в себя ServletListener
в моем web.xml
файл.
Вот что я имею ниже:
web.xml:
<listener>
<listener-class>com._1834Software.Config</listener-class>
</listener>
Я хотел бы сделать что-то вроде этого (что я нашел здесь на Stackru), но я не думаю, что это обязательно работает с Джерси:
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(); }
}
1 ответ
Есть много способов загрузить файлы свойств. Чтобы не вводить какие-либо новые зависимости в ваш проект, вот несколько фрагментов кода, которые могут вам помочь. Это всего лишь один подход...
Определите свой файл свойств. Я помещаю мой в src/main/resources/ как "config.properties"
sample.property=i am a sample property
В вашем конфигурационном файле jersey (при условии, что вы используете приложение, расширяющее класс), вы можете загрузить туда файл свойств, и он будет загружен только один раз во время инициализации приложения, чтобы избежать вашей озабоченности повторным вводом-выводом файла:
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;
}