簡體   English   中英

java.lang.IllegalStateException:無法使用Arquillian檢索unitName Horizo​​nPU的EntityManagerFactory

[英]java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName HorizonPU with Arquillian

我希望有人可以幫助我解決一個非常令人沮喪的問題。

我想使用Arquillian來測試我正在開發的Web應用程序,但是我很難讓JPA測試運行。 我對Arquillian來說還很陌生,我必須承認我覺得使用起來非常棘手。

我的測試用例如下:

  @RunWith(Arquillian.class)
public class BudgetFacadeTest
{
    @Deployment
    public static WebArchive deploy(){
        WebArchive archive =  ShrinkWrap.create(WebArchive.class, "testarchive.war")
                .addClasses(Budget.class, BudgetLine.class, BudgetSection.class, BudgetFacade.class)
                .addAsManifestResource("META-INF/persistence.xml", "persistence.xml")
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
        System.out.println(archive.toString(true));
        return archive;
    }

    @EJB
    BudgetFacade instance; 


        @Test
    public void testArquillianWorking(){
        instance.count();
    }
    }

這非常簡單。 持久性單元位於單獨的測試文件夾中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="HorizonPU" transaction-type="JTA">
        <jta-data-source>jdbc/horizonBase</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
            <property name="eclipselink.logging.level.sql" value="FINE"/>
            <property name="eclipselink.logging.parameters" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

收縮包裝的存檔結構如下:

testarchive.war:
/WEB-INF/
/WEB-INF/classes/
/WEB-INF/classes/com/
/WEB-INF/classes/com/macraeanddick/
/WEB-INF/classes/com/macraeanddick/marketinghorizon/
/WEB-INF/classes/com/macraeanddick/marketinghorizon/company/
/WEB-INF/classes/com/macraeanddick/marketinghorizon/company/Budget.class
/WEB-INF/classes/com/macraeanddick/marketinghorizon/company/BudgetSection.class
/WEB-INF/classes/com/macraeanddick/marketinghorizon/company/BudgetLine.class
/WEB-INF/classes/com/macraeanddick/facades/
/WEB-INF/classes/com/macraeanddick/facades/BudgetFacade.class
/META-INF/
/META-INF/beans.xml
/META-INF/persistence.xml

我相信一切井井有條,而POM如下:

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>        
    <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>4.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.container</groupId>
        <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
        <version>1.0.0.CR4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.shrinkwrap</groupId>
        <artifactId>shrinkwrap-impl-base</artifactId>
        <scope>test</scope>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>        
</dependencies>

<!--Arquillian Dependency BOMs -->
<dependencyManagement>
    <dependencies>        
        <dependency>
            <groupId>org.jboss.arquillian</groupId>
            <artifactId>arquillian-bom</artifactId>
            <version>1.1.5.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
        <testResource>
            <directory>src/test/resources-glassfish-embedded</directory>
        </testResource>
    </testResources>

但是,如果我運行測試,則會得到以下信息:

Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName HorizonPU
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:138)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:171)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:834)
    at com.macraeanddick.facades.AbstractFacade.count(AbstractFacade.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    ... 108 more

我完全不知道我在做什么錯,已經浪費了一天的時間。 任何建議將不勝感激!

最終,我走到了最底層。 如果要部署Web應用程序,則需要將persistence.xml文件放入WEB-INF / classes / META-INF /中,換句話說,META-INF不應位於存檔的頂層。 通常,關於Arquillian的文檔並不十分清楚如何實現此目的,但是針對我的問題的解決方案是將測試中的部署方法更改為:

WebArchive archive = ShrinkWrap.create(WebArchive.class, "testarchive.war")
        .addClasses(Budget.class, BudgetLine.class, BudgetSection.class, BudgetFacade.class)
        .addAsResource("META-INF/persistence.xml")
        .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");

注意,現在將persistence.xml與.addAsResource添加在一起,並將beans.xml作為.addAsWebInfResource添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM