1

私は、UIなしで、カートへの追加、数量の更新、注文などの基本的なショッピングカート操作を実行できるかどうかを確認するための概念実証として、BroadleafCommerceを単純なJUnit単体テストで実行しようとしています。

Broadleafをバックエンドとして使用して完全に異なるUIを使用できるかどうかを確認するためのアイデア。

これまでのところ、これを機能させるのは少し大変でした(Springコンテキストを起動して実行するためだけに)。Gradleを使用してプロジェクトをビルドしています。構成は次のようになります。

テストクラス:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
    "MyTest.xml",
})
public class BltMainTest {

@Test
public void test() {
    System.out.println("THIS IS A TEST");
}

}

MyTest.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       ">

<import resource="classpath:bl-framework-applicationContext-persistence.xml"/>
<import resource="classpath:bl-framework-applicationContext-entity.xml"/>
<import resource="classpath:bl-framework-applicationContext-workflow.xml"/>
<import resource="classpath:bl-framework-applicationContext.xml"/>
<import resource="classpath:bl-profile-applicationContext.xml"/>
<import resource="classpath:bl-profile-applicationContext-entity.xml"/>
<import resource="classpath:bl-profile-applicationContext-persistence.xml"/>

</beans>

build.gradleの抜粋(ehcacheをMaven Centralに対して機能させるには、少しハックする必要がありましたが、理由は完全にはわかりません):

...
dependencies {
...
 compile 'net.sf.ehcache:ehcache-core:2.6.0'

 compile('org.broadleafcommerce:broadleaf-framework:1.6.1-GA') {
     exclude module: 'ehcache-terracotta'
     exclude module: 'ehcache'
 }
 compile('org.broadleafcommerce:broadleaf-profile:1.6.1-GA') {
     exclude module: 'ehcache-terracotta'
     exclude module: 'ehcache'
 }
...
}

私が取得するスタックトレースはかなり長いですが、一番下の(そして私が関連すると思う)部分はこれです:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'blEntityManagerFactorySecureInfo' defined in class path resource [bl-framework-applicationContext-persistence.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.findEntityManagerFactory(EntityManagerFactoryUtils.java:99)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findNamedEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:511)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:493)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:657)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:630)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:339)
    ... 55 more
Caused by: java.lang.NullPointerException
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:527)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    ... 69 more

クラスを見ると、指定されていない永続性ユニットがあるようですが、それを修正するためにどこを見ればよいかわかりません。

その上、config.xmlファイルのSpringインポート行の順序を変更するとエラーが変わります。

おそらく私はこれに間違った方法でアプローチしていますが、デフォルトのBroadleaf Spring XMLを正しい順序で含めることで、これを機能させることができるはずだと思います-しかし、私はそれらのいくつかを試しましたが、サイコロはありません(いくつか同じエラー、いくつかの異なる、すべて悪い)。

これを機能させる方法について何かアイデアはありますか?

4

1 に答える 1

0

これをもう少し掘り下げた後、私はこれを機能させました。いくつかの特定のものが必要でした:

  1. 元の投稿のスタックトレースは、blPersistenceUnitManager Beanが2つの異なるSpringコンテキストファイルで定義されているために発生しました(通常のBroadleafセットアップでこれらがどのようにマージされているかはわかりません)。一方が他方をオーバーライドしていました。解決策は、構成を組み合わせたすべてをインポートした後に1つを定義して、必要な各永続性ユニットから読み取ることでした。
  2. 最新の4.xの代わりに3.6.8.FinalHibernateライブラリを明示的に使用する必要がありました(マップタイプの列をどうするかを理解できないという奇妙なエラー)
  3. blPasswordEncoderBeanを定義する必要がありました
  4. 注:以下の例のblCacheManager Beanは、EHCacheの問題を回避するために必要でした:http://jira.broadleafcommerce.org/browse/BLC-599

最終的に機能したSpringコンテキストの内臓は次のとおりです。

<import resource="classpath:bl-common-applicationContext.xml"/>

<import resource="classpath:bl-framework-applicationContext.xml"/>
<import resource="classpath:bl-profile-applicationContext.xml"/>

<import resource="classpath:bl-framework-applicationContext-workflow.xml"/>

<import resource="classpath:bl-framework-applicationContext-persistence.xml"/>
<import resource="classpath:bl-profile-applicationContext-persistence.xml"/>

<import resource="classpath:bl-framework-applicationContext-entity.xml"/>
<import resource="classpath:bl-profile-applicationContext-entity.xml"/>

<bean id="blCacheManager" class="org.broadleafcommerce.common.extensibility.cache.ehcache.MergeEhCacheManagerFactoryBean">
    <property name="shared" value="true"/>
</bean>

<bean id="blPersistenceUnitManager" class="org.broadleafcommerce.common.extensibility.jpa.MergePersistenceUnitManager">
    <property name="persistenceXmlLocations">
        <list>
            <value>classpath*:/META-INF/persistence-common.xml</value>
            <value>classpath*:/META-INF/persistence-framework.xml</value>
            <value>classpath*:/META-INF/persistence-profile.xml</value>
        </list>
    </property>
</bean>

<bean id="blPasswordEncoder" class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder"/>

これで、単体テストが構築、実行され、Hibernate環境が起動し、@ Resource()などを実行できるようになりました。まだすべてが機能しているかどうかはわかりませんが、これに対する回答を投稿すると思いました。そこまで来たので質問。

于 2012-09-17T01:33:25.700 に答える