0

私の問題に対する答えを見つけるために Stackoverflow を検索しましたが、非常によく似た問題がいくつか見つかりましたが、答えはありませんでした。

私がやろうとしていること: Glassfish 4.1 組み込みコンテナーが開始される簡単な junit テストを作成し、EJB の簡単な操作をテストします。

サンプル EJB:

@Stateless
@LocalBean
public class ExampleBean {

    public int meaningOfLife() {
        return 42;
    }
}

ものすごく単純。これが私の単体テストです:

public class BasicTest {
    @EJB
    private ExampleBean examplebean;

    private static Context context;

    private static EJBContainer container;

    @BeforeClass
    public static void init() {

        Map<String,Object> props = new HashMap<String,Object>();
        //props.put(EJBContainer.MODULES, new File("target/classes"));
        props.put(EJBContainer.MODULES, new File("D:\\Development\\IDE\\workspace-templates\\jee7-template\\template-service\\target"));

        try {
            container = EJBContainer.createEJBContainer(props);//.getContext().bind("inject", this);
            context = container.getContext();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

私の pom.xml 依存関係:

    <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-static-shell</artifactId>
        <version>4.1</version>
        <scope>system</scope>
        <systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath>
    </dependency>

また、次の依存関係を追加してみました。

    <dependency>
        <groupId>org.glassfish.main.ejb</groupId>
        <artifactId>ejb-container</artifactId>
        <version>4.1</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>javax.ejb</groupId>
        <artifactId>javax.ejb-api</artifactId>
        <version>3.2</version>
        <scope>test</scope>
    </dependency>

結果: 埋め込まれた GF 4.1 コンテナーは、その単純な EJB をロードできませんでした (maven コンパイル後に target/classes フォルダーにあります)。

さまざまなコード変更 (プロパティを使用してコンテナーに渡すかどうかなど) に基づいて、次のエラーが発生します。

GF 4.1 組み込みの UnsatisfiedDependencyException

GF 4.1 Embedded を展開できない

GF 4.1 Embedded で EJB クラスをデプロイできない

貼り付けたコードは、リンクされた最後のエラー メッセージを表示しています。

そして、私は理解していません。私が情報を探すところはどこでも、これはうまくいくはずだと言っています。

また、これを OpenEJB コンテナー (残念ながら jee6 のみ) で試してみると、正常に動作します。

<dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>openejb-core</artifactId>
    <version>4.7.3</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0-6</version>
    <scope>test</scope>
    </dependency>

助けてくれてありがとう!

4

2 に答える 2

0

問題の解決策を見つけたと思います(現在は機能しているようですが、これが本当のものかどうかはわかりません)。

修正された依存関係:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.glassfish.main.common</groupId>
    <artifactId>simple-glassfish-api</artifactId>
    <version>4.1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-static-shell</artifactId>
    <version>4.1</version>
    <scope>system</scope>
    <systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath>
</dependency>

したがって、本当に欠けていたのは org.glassfish.main.common / simple-glassfish-api jar です (これが私の問題の解決策である理由はよくわかりません)。

そして、ここに修正コードがあります:

public class BasicTest {
@EJB
private ExampleBean examplebean;
private Context context;
private EJBContainer container;

@Before
public void init(){
    try {
        container = EJBContainer.createEJBContainer();
        context = container.getContext();
        context.bind("inject", this);
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Test
public void testmeaning() throws NamingException{
    if(examplebean == null){
        examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean");
    }

    assertEquals(42, examplebean.meaningOfLife());
}
}

または @BeforeClass で静的メンバーを使用する

public class BasicTest {

@EJB
private ExampleBean examplebean;
private static Context context;
private static EJBContainer container;

@BeforeClass
public static void init() {
    container = EJBContainer.createEJBContainer();
    context = container.getContext();
}

@Test
public void testmeaning() throws NamingException {
    if (examplebean == null) {
        examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean");
    }
    assertEquals(42, examplebean.meaningOfLife());
}

}
于 2016-01-14T09:58:35.717 に答える