【问题标题】:Spring + Hibernate Session Factory: Mapping File Directory Inside a JARSpring + Hibernate Session Factory:在 JAR 中映射文件目录
【发布时间】:2012-01-04 16:17:24
【问题描述】:

我有基于 Hibernate 和 Spring(编程配置)的 Web 项目。 Hibernate 映射在一个包中提供,该包被归档在一个 JAR 中。

说到初始化我曾经调用的会话工厂:

sessionFactory.
    setMappingDirectoryLocations(new Resource[]{
        new ClassPathResource("org/all/theway/to/hibernatemappings")});

为了告诉 Hibernate 在哪里寻找映射文件。 “org/all/theway/to/hibernatemappings”是包含 hbm.xml 文件的包。这在 Eclipse(GWT 开发模式)中运行良好,因为包含映射的项目也已检出并链接到我的 Web 项目。但是,一旦我创建了一个战争并将其部署到 Tomcat,它就无法获取类路径资源。

Spring 的 ClasspathResource javadoc 暗示:“如果类路径资源驻留在文件系统中,则支持解析为 java.io.File,但不支持 JAR 中的资源。始终支持解析为 URL。 "

但是该怎么做呢?我也可以改用 setMappingJarLocation,但我不喜欢在我的 Spring 上下文中硬编码 jar 文件名。此外,当我尝试它时,它也只能在 IDE 中工作,但在 Tomcat 中,相同的文件路径(WEB-INF/lib/file.jar)不起作用。这也让我相信这将是一个丑陋的解决方案。

是否有不使用 jar 文件的解决方法?

【问题讨论】:

    标签: hibernate spring jar hibernate-mapping applicationcontext


    【解决方案1】:

    这行得通

    //所有应用上下文实现ResourcePatternResolver

    ResourcePatternResolver resourcePatternResolver= applicationContext;
    sessionFactory.setMappingDirectoryLocations(resourcePatternResolver.getResources("classpath*:org/all/theway/to/hibernatemappings/*.hbm.xml"));
    

    编辑:将 DefaultResourceLoader 替换为 ResourcePatternResolver。

    【讨论】:

    • 谢谢,但很抱歉,没有帮助:java.io.FileNotFoundException: 类路径资源 [classpath*:/org/all/theway/to/hibernatemapping] 无法解析为 URL,因为它没有存在
    • 您自己是否在 * 之后包含了“/”,或者它在错误消息中,尽管您没有包含它?通常当某些东西在 jar 文件中时,通过在路径之前给出“classpath*”。 Spring 的 LocalSessionFactoryBean 在 xml 配置中接受这种模式。检查jira.springsource.org/browse/SPR-469。在调试完 Spring 的代码后,我给了你等价的 xml 配置。
    • @rainer198 抱歉,我意识到我之前回答中的错误。检查编辑后的答案,如果您仍在寻找不同的解决方案,它无需更改即可工作。
    • 我去看看。再次感谢
    【解决方案2】:

    不是真正解决原始问题,而是避免在配置代码中处理 jar 文件的文件系统文件名的解决方法:

    我只是告诉 ant 将有问题的 JAR 解压到 WEB-INF/classes 文件夹中

    <target name="unpack.hibernatemappings">
        <unzip dest="${war.dir}/WEB-INF/classes">
            <fileset dir="${lib.dir}">
                <include name="archive-containing-the-hbm-files.jar"/>
            </fileset>
        </unzip>
    </target>
    

    现在,Hibernate 映射驻留在文件系统中,并且可以作为 ClassPathResource 访问(就像在问题的示例中一样)。

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 1970-01-01
      • 2010-12-27
      • 2017-08-12
      • 2013-01-17
      • 2010-10-28
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多