Glassfish嵌入式无法部署EJB模块

时间:2016-01-08 14:59:01

标签: maven junit4 java-ee-7 glassfish-embedded

我通过Stackoverflow搜索了我的问题的答案,发现了一些非常类似的问题,但没有答案。

我想做什么: 创建一个简单的junit测试,启动Glassfish 4.1嵌入式容器,并测试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 Embedded UnsatisfiedDependencyException

GF 4.1 Embedded Can't deploy

GF 4.1 Embedded Can't deploy EJB classes

我粘贴的代码是链接的最后一条错误消息。

我不明白。我到处寻找信息,说这应该有效。

另外,如果我尝试使用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>

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

可能不是问题的答案,而是对单元测试EJB的一些更一般的想法:

正如名称所说,单元测试应该只测试单元本身,仅此而已。由于EJB 3.x bean是POJO,因此您只需编写一个简单的JUnit测试,而无需(嵌入式)容器。关于对其他bean的引用,使用像Mockito之类的框架来模拟它们。

在进行集成测试时,您希望多个EJB进行交互,可能与数据库协作,那么您需要容器,例如:有依赖注入。您可以在此处使用嵌入式容器,但也可以使用Arquillian之类的框架,因为您可以使用真正的容器。

答案 1 :(得分: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());
}

}