2016-04-29 50 views
4

在使用測試參數啓動maven時,出現上述異常。在創建集成測試部署,我得到如下:無法處理EJB類的業務接口

org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0466: Failed to process business interfaces for EJB class class ..contract.ContractMockService 

的有關類看起來是這樣的:

package ..integration.bestand.contract; 

import java.time.LocalDate; 
import java.util.ArrayList; 

import javax.ejb.Local; 
import javax.ejb.Stateless; 

import org.apache.deltaspike.core.api.exclude.Exclude; 
import org.apache.deltaspike.core.api.projectstage.ProjectStage; 

... 

@Exclude(ifProjectStage = { 
    ProjectStage.Production.class, 
    ProjectStage.Staging.class, 
    ..Integration.class, 
    ..Qs.class, 
    ..PatchQs.class 
}) 
@Stateless 
@Local(IContractIntService.class) 
public class ContractMockService implements IContractIntService { 

    ... 

    return ContractBuilder.build(); 
    } 

} 

接口IContractIntService的樣子:

package ..integration.bestand.contract; 

import javax.ejb.Local; 

... 

@Local 
public interface IContractIntService { 

    public enum State { 
    SUCCESS, 
    UNKNOWN_ERROR, 
    NOT_FOUND; 
    // TODO: Stati für Fehler hier definieren 
    } 

    //Interface comment 
    Result<State, ContractDTO> retrieveContract(String contractIdentifier); 
} 

注:接口是在另一個項目,這是通過maven包括。

測試看起來是這樣的:

package ..api.contractregistration.service; 

import static org.hamcrest.CoreMatchers.any; 
import static org.hamcrest.MatcherAssert.assertThat; 

import java.util.logging.Logger; 

import org.jboss.arquillian.container.test.api.Deployment; 
import org.jboss.arquillian.junit.Arquillian; 
import org.jboss.shrinkwrap.api.ShrinkWrap; 
import org.jboss.shrinkwrap.api.asset.EmptyAsset; 
import org.jboss.shrinkwrap.api.spec.WebArchive; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.experimental.categories.Category; 
import org.junit.rules.TestWatcher; 
import org.junit.runner.RunWith; 

import ..core.test.IntegrationTest; 

@RunWith(Arquillian.class) 
@Category(IntegrationTest.class) 
public class ContractRegistrationIntegrationTest { 

    protected final Logger log = Logger.getLogger(ContractRegistrationIntegrationTest.class.getCanonicalName()); 

    @Rule 
    public TestWatcher watcher = new TestWatcher() { 

    @Override 
    protected void starting(org.junit.runner.Description description) { 
     log.info(String.format("---> Starting test: %s", description)); 
    } 

    @Override 
    protected void failed(Throwable e, org.junit.runner.Description description) { 
     log.info(String.format("<--- Test failed: %s", description)); 
    } 

    @Override 
    protected void succeeded(org.junit.runner.Description description) { 
     log.info(String.format("<--- Test succeeded: %s", description)); 
    } 
    }; 

    @Deployment 
    public static WebArchive createDeployment() { 
    WebArchive result = ShrinkWrap.create(WebArchive.class) 
     .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") 
     .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml") 
     .addPackages(true, "..ejb.portal") 
     .addPackages(true, "..core") 
     .deletePackages(true, "..core.config.deltaspike") 
     .addPackages(true, "..integration") 
     .addPackages(true, "..api") 
     .addPackages(true, "org.apache.deltaspike.core") 
     .addPackages(true, "..ejb.util"); 
    System.out.println("########## TEST DEPLOYMENT########" + result.toString(true)); 

    return result; 
    } 

    @Test 
    public void test() { 
    String tempPw = "bla"; // result.getDto(); 
    assertThat(tempPw, any(String.class)); 
    } 

} 

有關此測試的了不起的事情是,我還沒有使用測試裏面MockService的東西。

Maven配置是這樣的:

目標:clean test -Parq-wildfly-managed JRE VM參數:-Djboss.home="myLocalWildflyDirectory"

JAVA_HOME設置爲jdk8。

最後一件事是我的POM,容器 「ARQ-wildfly管理」 的具體部分:

... 

     <profile> 
      <!-- An optional Arquillian testing profile that executes tests in your WildFly instance, e.g. for build server --> 
      <!-- This profile will start a new WildFly instance, and execute the test, shutting it down when done --> 
      <!-- Run with: mvn clean test -Parq-wildfly-managed --> 
      <id>arq-wildfly-managed</id> 
      <dependencies> 
       <dependency> 
        <groupId>org.wildfly.arquillian</groupId> 
        <artifactId>wildfly-arquillian-container-managed</artifactId> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-bestand-mock-ejb</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-docservice-mock-ejb</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <scope>test</scope> 
       </dependency>  
       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-bestand-api</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
       </dependency>   

      </dependencies> 
     </profile> 
... 

正常Maven構建與clean verify package install(包括只是沒有測試)構建成功。

注意:對於本文,我重新命名了軟件包以排除公司專業化。

類似的錯誤提示更正了ShrinkWrap部署,但我實際上包含了每個包,甚至試圖明確包含接口類。但仍然存在同樣的錯誤。

這是什麼原因造成的?

+0

您似乎誤解了Maven的生命週期。如果你通過'mvn clean verify package install'調用maven,那麼幾件事情就是運行double或triple。你簡單需要的是:'mvn clean install'或'mvn clean verify' ..推薦閱讀https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html – khmarbaise

+0

@khmarbaise謝謝你的建議。我可以清楚地說,我不是Maven的專家。我以前使用你提到的運行配置,他們的工作,但我的問題不是針對工作的構建。 '測試'版本正在產生上述錯誤,並讓我無能爲力...... – EngJon

+0

也許你的IContractService由於缺少依賴關係而無法加載。您可能需要在INFO級別的org.jboss.weld.Bootstrap類別下檢查日誌,以確保所有的bean定義都已正確註冊。 – Franck

回答

0

在Test(拆封)試試這個:

.addAsResource(new StringAsset("org.apache.deltaspike.ProjectStage=IntegrationTest"), "META-INF/apache-deltaspike.properties") 

,改變你排除這樣的:

@Exclude(exceptIfProjectStage = ProjectStage.IntegrationTest.class) 

如果您需要排除額外的階段,將它們添加到這個非常排除語句

+1

這個伎倆!我也包括我的製片人的排除,也解決了其他問題。 – EngJon

+0

由於我不想讓我的賞金過期,這個答案看起來很合適,雖然它可能有更多的細節,爲什麼這個排除不起作用,但嘿,它的工作;) – EngJon

0

稍遲,但更好的解決方案是:

在ShrinkWrap部署中,需要使用shrinkwrap maven解析器。所以,而不是

.addPackages(true, "org.apache.deltaspike.core") 

裏面創建result,使用maven解析器。應該看起來像這樣:

ShrinkWrap 
    .create(WebArchive.class, "test.war") 
    .addAsLibraries(
     resolver.artifact("org.apache.deltaspike.core") 
    .resolveAsFiles()); 

工件是maven artifactId。這將返回另一個.war。可以合併多個.wars(從解析器創建或您在原始問題中看到的方式)。這個合併的.war然後必須從部署方法返回。

原因背後: 一旦通過ShrinkWrap.create.*.addAsPackages..導入外部包含(本例中爲deltaspike),它們就會缺失資源,因此只能用於內部項目包。要使用maven解析,您可以包括在.pom文件如下:

<dependency> 
<groupId>org.jboss.shrinkwrap.resolver</groupId> 
<artifactId>shrinkwrap-resolver-impl-maven</artifactId> 
<scope>test</scope> 
</dependency> 

學分dzone.com的行家解析代碼片斷。我目前正在研究另一個項目,所以我不能顯示原始代碼,但它與此非常相似。

也許這個解決方案將在未來幫助某人。