【问题标题】:Spring Boot *.hbm.xml mapping files not loaded in testSpring Boot *.hbm.xml 映射文件未在测试中加载
【发布时间】:2016-01-30 23:12:36
【问题描述】:

这个问题很难解释,所以请看项目:https://github.com/darzz/boot_bug 这是重现错误的最小设置。

说明: 应用程序堆栈是带有 Spring Data 和 Spring Batch 的 Spring Boot。 src/main/resources/queries下有testNamedQuery.hbm.xml文件。

Application 类运行时,批处理作业成功完成,日志中没有异常。但是,当从 ApplicationNotWorking 类运行时,它是完全复制的,只需放入测试源根目录,批处理作业就会失败:

Caused by: org.hibernate.MappingException: Named query not known: findPersonNames
    at org.hibernate.internal.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:177) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.springframework.batch.item.database.HibernateItemReaderHelper.createQuery(HibernateItemReaderHelper.java:146) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.batch.item.database.HibernateItemReaderHelper.getForwardOnlyCursor(HibernateItemReaderHelper.java:123) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.batch.item.database.HibernateCursorItemReader.doOpen(HibernateCursorItemReader.java:185) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    ... 39 common frames omitted

看起来在运行测试时,没有加载 *.hbm.xml 文件! 经过研究和调试,我想,我可能已经找到了原因 - 为目标/测试类的测试设置了持久性单元根 url,但映射文件在 /target/classes 中。

可能的原因在我看来可能与这里http://blog.carbonfive.com/2007/05/17/using-classpath-vs-classpath-when-loading-spring-resources/中描述的类似

但是我不知道如何在 Spring Boot 中解决这个问题,而不是仅仅为了测试目的而创建 persistence.xml 配置。也不想将 *.hbm.xml 文件从 main/resources 复制到 test/resources。

有人有想法吗?

【问题讨论】:

    标签: java spring hibernate spring-boot hibernate-mapping


    【解决方案1】:
    @Autowired
    private ResourceLoader rl;
    
    
    @Bean
    public LocalSessionFactoryBean sessionFactory() throws IOException {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setMappingLocations(loadResources());
        return sessionFactoryBean;
    }
    
    public Resource[] loadResources() {
        Resource[] resources = null;
        try {
            resources = ResourcePatternUtils.getResourcePatternResolver(rl)
                .getResources("classpath:/hibernate/*.hbm.xml");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resources;
    }
    

    【讨论】:

      【解决方案2】:

      如果我正确理解了这个问题,你想运行 Spring Boot Test,它应该从类路径中获取 *.hbm 文件。

      您将 *.hbm 文件保存在哪里?

      您必须确保所有 *.hbm 文件都保存在 src/main/resources 下。 因此,当您运行测试类时,它将调用从 src 引用 *.hbm 文件的实际类/main/resources。

      如果上述解决方案没有帮助,那么您需要共享您的项目文件结构。

      【讨论】:

      • 您好,谢谢您的回答。我创建了一个最小的项目,它重现了问题并将其放在 github 上 - 请看一下(原始问题已编辑)。对我来说,这是一些奇怪的东西,但我刚刚开始了我的春季靴子之旅......
      • 你在做Restful服务吗?您需要对 Spring Boot 使用集成测试。尽管创建了 springbootapplication 类进行测试;您需要使用 @RunWith(SpringJUnit4ClassRunner.class) & @SpringApplicationConfiguration(classes = AppMain.class) 创建测试类
      • 不,只是 spring 批处理应用程序,不想用本地数据库进行端到端测试,但是 *.hbm.xml 文件没有加载,即使我使用你建议的。
      【解决方案3】:

      我查看了 git 项目。看来您需要更改 ApplicationNotWorking.java 因为它是一个测试类,因此应该如下所示:

      //src/test/java

      package bug;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired; 
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      import com.stackoverflow.springboot.BatchProcessing;
      
      @RunWith(SpringJUnit4ClassRunner.class)
      @SpringApplicationConfiguration(classes = Application.class )
      public class ApplicationNotWorking {
          //Inject required bean which you want to test.
          @Autowired
          private BatchProcessing bProcess;
          //If above @Autowired BatchProcessing  do not work then you can object  
          //directly to kick off the test. BatchProcessing bProcess = new 
          //BatchProcessing();    
      
          //This way you can test each method
          @Test
          public void testBatchProcessing(){
              System.out.println("***BatchProcessing: " + bProcess.batchProcess());
          }
      }
      

      【讨论】:

      • 感谢您的回答,但这仍然不能解决不加载 *.hbm.xml 文件的问题。
      猜你喜欢
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      相关资源
      最近更新 更多