Загрузка файла свойств в веб-приложение 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 ответ

Есть много способов загрузить файлы свойств. Чтобы не вводить какие-либо новые зависимости в ваш проект, вот несколько фрагментов кода, которые могут вам помочь. Это всего лишь один подход...

  1. Определите свой файл свойств. Я помещаю мой в src/main/resources/ как "config.properties"

    sample.property=i am a sample property
    
  2. В вашем конфигурационном файле 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;
    }
    
    }
    
  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;
}
Другие вопросы по тегам