gpt4 book ai didi

java - 使用 ServletContext 从外部 war 读取 Hibernate 属性

转载 作者:行者123 更新时间:2023-11-30 04:50:21 25 4
gpt4 key购买 nike

首先,对于重复常见问题的变体表示歉意。然而,我正在努力理解这里的最佳方法。我有一个使用 Hibernate 和 Glassfish 3 的应用程序。与其他应用程序一样,我希望能够从 war 文件外部加载 Hibernate 属性。我设法开始工作的唯一解决方案如下。它从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;
}

但是,我还找到了示例 How to read properties file placed outside war?使用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;
}
}

我可以理解,第二个解决方案将搜索 Servlet 的 CLASSPATH -(这是正确的吗?),因此比我原来的解决方案更灵活。但是,我不明白如何使用(访问)我的 HibernateUtils 类中的属性。我想这意味着我对 ServletContext 的理解中缺少一些基本的东西......

任何帮助、建议、更好的解决方案表示赞赏......

最佳答案

ServletContext.getResourceAsStream 通常用于从 Web 应用程序本身加载文件。例如,如果您将属性文件放置为:

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

然后您可以使用加载文件

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

该方法也可用于从 jar 文件加载“资源”,但第一种方法可能更适合获取配置文件。 JavaDocs在这种情况下非常有帮助。

==更新==

我现在看到你的问题是,如何将属性对象从 servlet 上下文中获取到 Hibernate 配置中。这取决于您的应用程序布局。你使用Spring吗?

假设你是这样,一个快速而肮脏的解决方案是让 HibernateUitl 实现 ServletContextAware 接口(interface)(假设 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 与 Servlet API 结合起来,这可能是不可取的。一个稍微简洁的解决方案可能是创建一个 HibernatePropertiesSource 接口(interface),然后拥有一个 ServletContextHibernatePropertiesSource 实现,该实现具有上述方法并将其注入(inject) HibernateUtil 中。

再次强调,这一切都是假设您使用的是 Spring。

关于java - 使用 ServletContext 从外部 war 读取 Hibernate 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995459/

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