2015-10-30 2 views
1

Проблема трудно объяснить, поэтому, пожалуйста, взгляните на проект: https://github.com/darzz/boot_bug Это минимальная настройка, которая воспроизводит ошибку.Spring Boot * .hbm.xml файлы сопоставления, не загруженные в тест

Описание: Стек приложения - весенняя загрузка с данными весны и весной. Существует testNamedQuery.hbm.xml файл под src/main/resources/queries.

При работе с Применение класса пакетное задание заканчивается успешно, без каких-либо исключений в журналах. Однако, при работе с 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 ботинке, не создавая persistence.xml конфигурацию только для целей тестирования. Не хотите копировать * .hbm.xml файлы из основного/ресурса для тестирования/ресурсов.

У кого-нибудь есть идеи?

ответ

1
@Autowired 
private ResourceLoader rl; 


@Bean 
public LocalSessionFactoryBean sessionFactory() throws IOException { 
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
    sessionFactoryBean.setMappingLocations(loadResources()); 
} 

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; 
} 
0

Если я правильно понял проблему, вы хотите запустить Spring Boot Test, который должен забрать * .hbm файлы из classpath.

Где вы храните файлы * .hbm?

Вы должны убедиться, что все * .hbm-файлы хранятся под управлением src/main/resources. Следовательно, когда вы запускаете тестовый класс, который вызывается фактическим классом, который ссылается на * .hbm-файлы из src/main/resources.

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

+0

Привет, спасибо за ответ. Я создал минимальный проект, который воспроизводит проблему и помещает ее в github - пожалуйста, посмотрите (исходный вопрос был отредактирован). Для меня это какой-то странный материал, но я только начал свое путешествие с весенним ботинком ... – darzz

+0

Вы делаете Restful обслуживание? вам нужно использовать тестирование интеграции для загрузки Spring. Несмотря на создание класса springbootapplication для тестирования; вам нужно создать тестовый класс, используя @RunWith (SpringJUnit4ClassRunner.class) & @SpringApplicationConfiguration (classes = AppMain.class) –

+0

Нет, просто весеннее пакетное приложение, чтобы завершить тесты с локальной базой данных, но файлы * .hbm.xml не загружаются, даже если я использую то, что вы предложили. – darzz

0

Я заглянул в проект git. Похоже, что вам нужно изменить ApplicationNotWorking.java, так как это тестовый класс, следовательно, должно быть что-то, как показано ниже:

// SRC/тест/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()); 
    } 
} 
+0

Благодарим вас за ответ, но это все еще не решает проблему, не загружая файл * .hbm.xml. – darzz

Смежные вопросы