2011-12-21 16 views
8

Spring için yeni ve ProjectName/WebContent/WEB-INF/applicationContext.xml dosyasındaki tüm XML yapılandırmasına sahip bir Spring projesi miras aldım. Yapılandırmayı farklı bileşenlere ayırmaya çalışıyorum, bu nedenle test ederken DataSources ve Hazırda Bekleme yapılandırması gibi şeylerin yerini değiştirmek daha kolay.Bağlantılı yol kullanarak Spring Bean tanımlama dosyası alınamadı

İşte benim dosya yapısı şöyledir:

ProjectName 
    ->WebContent 
     ->WEB-INF 
      ->applicationContext.xml 
      ->spring-datasource.xml 
      ->spring-hibernate-properties.xml 
      ->spring-persistence.xml 
    ->test 
     ->us.mn.k12... (Java pkgs with JUnit tests) 
     ->spring-hsqldb-datasource.xml 
     ->spring-test-bean-locations.xml 
     ->spring-test-hibernate-properties.xml 
    ->src 
     ->us.mn.k12... (Java pkgs with production code) 

WEB-INF/applicationContext.xml, ben şu içe:

<import resource="spring-datasource.xml"/> <!-- Production datasource --> 
<import resource="spring-hibernate-properties.xml"/> <!-- Production hibernate properties --> 
<import resource="spring-persistence.xml"/> <!-- DAO's, hibernate .hbm.xml mapping files --> 

uygulama yukarıdaki yapılandırma ile çalışır.

JUnit testlerim DbUnit ve bir HSQLDB bellek içi veritabanını kullanarak çalışır. Yani şu vardır benim JUnit test referanslar yay test fasulye locations.xml: Bu şekilde

<import resource="spring-hsqldb-datasource.xml"/> <!-- HSQLDB datasource for test --> 
<import resource="../WebContent/WEB-INF/spring-persistence.xml"/> <!-- Production DAO's, hibernate .hbm.xml mapping files --> 
<import resource="spring-test-hibernate-properties.xml"/> <!-- Hibernate properties for test --> 

Ben Test veri kaynağı belirtmek ve özelliklerini hazırda bekletme, ancak DAO en üretim eşleme dosyası yeniden kullanabilirsiniz, Ancak, JUnit testimi çalıştırırken bir hata alıyorum. Şimdi göreli yolunu kullanmak zorunda ve sonra, <import resource="spring-persistence.xml"/> testler ona başvuru kalmamak G/teste yay persistence.xml taşırsanız

Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [../WebContent/WEB-INF/spring-persistence.xml] 
Offending resource: class path resource [spring-test-bean-locations.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [../WebContent/WEB-INF/spring-persistence.xml]; nested exception is java.io.FileNotFoundException: class path resource [../WebContent/WEB-INF/spring-persistence.xml] cannot be opened because it does not exist 

: Burada istisna ilgili bölümü olan iyi koş. Bu yüzden, XML dosyalarının içeriğinin iyi olduğunu düşünüyorum, ancak göreceli bir yolla düzgün bir şekilde içe aktarma yapıyorum.

Göreli yolumun içe aktarılmasıyla yanlış yaptığım açık bir şey var mı? Ve belki de daha büyük soru bu test için daha kolay hale getirmek için applicationContext.xml bileşenlerini kırmak için makul bir strateji gibi görünüyor mu?

Teşekkürler!

cevap

18

Sorun şu ki: WEB-INF içinde normal bir proje kurulumunda ClassLoader için hiçbir şey kullanılamaz (ve kaynaklara erişmek için Spring varsayılan olarak ClassLoader kullanır). Bu etrafında çalışmak için bazı hackler vardır (dosyaları kullanarak öneklere başvurmak gibi: önek), ancak bunlar çoğunlukla çirkin.

Daha iyi bir uygulama, bağlam dosyalarını WEB-INF'den ayrılmış bir kaynak dizine (maven kurulumunuz varsa, src/main/resources) taşımaktır. Bu şekilde, hem webapp ClassLoader hem de yerel birim testi ClassLoaders için kullanılabilir olacak. İlgili mekanizmaları daha fazla anlamak için resources chapter numarasını okuyun.

+1

Açıklama için teşekkürler Sean. Ant kullanıyoruz ve projemizin kökünde sadece 3 düğüm olarak src, test ve WebContent/WEB-INF var. Üretim Spring xml dosyalarını src dizinine koyar ve test dizisindeki Spring xml testi tipik bir kurulum olur mu? Veya Maven olmayan bir kurulumda yaygın olarak kullanılan başka yerlerdir. Teşekkürler! – buck64

+0

@ buck64 evet, bunu yapardı. Maraen'de, sınıfları kaynaklardan ayırmak için bir sözleşme var, ama sınıf yükleyicisine hepsi aynı. –

+0

eğer durum böyleyse, kavanozlarımın (fasulyelerle) /applications/Foo.ear/FooWebApp'a yerleştirilmesi nasıl mümkün olabilir.savaş/WEB-INF/lib ve her şey çalışıyor! – voipp

11

Kullanım

<import resource="file:**/WebContent/WEB-INF/spring-persistence.xml" /> 

Bahar 3.2.1.RELEASE çalışır. Eski versiyonlar emin değilim.

İlgili konular