Читайте свойства Hibernate извне, используя ServletContext - PullRequest
1 голос
/ 03 апреля 2012

Во-первых, извинения за повторение варианта часто задаваемого вопроса. Однако я изо всех сил пытаюсь понять лучший подход здесь. У меня есть приложение, которое использует Hibernate и Glassfish 3. Как и другие, я хотел бы иметь возможность загружать свойства Hibernate извне файла war. Единственное решение, которое мне удалось найти - это следующее. Он загружает свойства из папки domains / domain1 / config.

private Properties getLocalHibernateProperties() {
  Properties properties = new Properties();
  try {
    File pf = new File(System.getProperty("user.dir"), PROPERTIES_FILE_NAME);
    InputStream inStream = new FileInputStream(pf);
    properties.load(inStream);
  }
  catch (Exception e) {
    e.printStackTrace();
  }     
  return properties;
} 

Однако я также нашел и пример Как прочитать файл свойств, размещенный вне войны? , который использует ServletContext. Объединение различных частей:

in web.xml <listener-class>foo.bar.startup.HibernatePropertiesLoader</listener-class>

public class HibernatePropertiesLoader implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event){
        ServletContext context = event.getServletContext();
        context.setAttribute("settings", new HibernatePropertiesReader(context));
    }
    public void contextDestroyed(ServletContextEvent event){}
}

public class HibernatePropertiesReader {
  ServletContext ctx = null;

  public HibernatePropertiesReader(ServletContext ctx) {
    this.ctx = ctx;
  }

  public Properties getLocalHibernateProperties() {
    Properties properties = new Properties();
    try {
      InputStream inStream = ctx.getResourceAsStream(PROPERTIES_FILE);
      properties.load(inStream);
    }
    catch (Exception e) {
      e.printStackTrace();
      }     
    return properties;
    }
}

Я могу понять, что второе решение будет искать CLASSPATH сервлета - (это правильно?), И поэтому оно более гибкое, чем мое первоначальное решение. Однако я не понимаю, как использовать (получить доступ) свойства из моего класса HibernateUtils. Я предполагаю, что это означает, что в моем понимании ServletContext чего-то не хватает ...

любая помощь, совет, лучшие решения приветствуются ...

1 Ответ

2 голосов
/ 03 апреля 2012

ServletContext.getResourceAsStream обычно используется для загрузки файла из самого веб-приложения. Например, если вы разместите файлы свойств как:

<CONTAINER_ROOT>/webapps/<CONTEXT>/WEB-INF/conf/hibernate.properties

Затем вы можете загрузить файл, используя

ctx.getResourceAsStream("/WEB-INF/conf/hibernate.properties");

Этот метод также можно использовать для загрузки «ресурсов» из файлов JAR, но первый метод, вероятно, лучше для получения файла конфигурации. JavaDocs весьма полезны в этом случае.

== UPDATE ==

Теперь я вижу, что ваша проблема в том, как вывести объект свойств из контекста сервлета в вашу конфигурацию Hibernate. Это зависит от того, на что похож ваш макет приложения. Вы используете Spring?

Предполагая, что вы, быстрое и грязное решение состояло бы в том, чтобы HibernateUitl реализовал интерфейс ServletContextAware (при условии, что HibernateUtil создан Spring) и имел код, подобный следующему

public class HibernateUtil implements ServletContextAware {

private ServletContext servletContext;

...

public void setServletContext(ServletContext servletContext) {
    this.servletContext = servletContext;
}

private Properties getProperties() {
  return servletContext.getAttribute("settings").getLocalHibernateProperties();  
}

...

}

Однако это связывает HibernateUtil с API сервлета, что может быть нежелательно. Несколько более чистое решение может заключаться в создании интерфейса HibernatePropertiesSource, а затем в реализации ServletContextHibernatePropertiesSource, которая имеет вышеуказанные методы, и внедряет ее в HibernateUtil.

Опять же, все это предполагает, что вы используете Spring.

...