WebLogic运行嵌入式EJB容器应用

学习EJB真的是遇到了很多问题,Java EE官方教程都是用的Netbeans与glassfish开发的例子,而我硬要用Eclipse和WebLogic,不知道是我这个组合比较冷门还是大家都是专家,遇到问题很不容易在网上找到答案,只好一点点的拼凑知识点,以及网上差不多相似的问题,才能解决我遇到的问题。今天这个是用WebLogic运行一个嵌入式的EJB容器,不用启动服务器,这样可以很方便的进行单元测试

创建项目

项目结构如下:


Standalone是一个简单的Stateless Session Bean,就是返回一个字符串,代码如下:

package com.zxuqian.ejb;

import javax.ejb.Stateless;

@Stateless
public class StandaloneBean {
	
	private final String message = "Greetings";

	public String returnMessage() {
		return message;
	}

}
StandaloneTest是一个单元测试类,代码如下:

package com.zxuqian.ejb.test;

import static org.junit.Assert.*;

import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;

import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.zxuqian.ejb.StandaloneBean;

public class StandaloneTest {
	private static final Logger logger = Logger.getLogger("com.zxuqian.ejb");
	private EJBContainer ec;
	private Context ctx;

	@Before
	public void setUp() throws Exception {
		Properties props = new Properties();
		//props.setProperty(EJBContainer.PROVIDER, "weblogic.ejb.embeddable.EJBContainerProvider");
		ec = EJBContainer.createEJBContainer();
		ctx = ec.getContext();
		
	}

	@After
	public void tearDown() throws Exception {
		if(ec != null) {
			ec.close();
		}
	}

	@Test
	public void test() throws Exception {
		logger.info("测试com.zxuqian.ejb.StandaloneBean.returnMessage");
		StandaloneBean instance = (StandaloneBean) ctx.lookup("java:global/classes/StandaloneBean");
		
		String expResult = "Greetings";
		String result = instance.returnMessage();
		assertEquals(expResult, result);
	}

}
在JUnit的setUp方法中做了一些初始化工作,EJBContainer.createEJBContainer是用来初始化EJB嵌入式容器的,然后getContext()获取上下文,进行JNDI查找。在test方法中,先获取StandaloneBean的引用,然后定义期望获得的值“Greetings”,然后比较结果是否一致。

运行项目

在项目的build path中加入weblogic.jar,在weblogic安装目录\wlserver_12.1\server\lib目录下,然后它会自动导入它所需要的包。



在运行项目时,遇到了不少问题,开始我用了wlfullclient.jar包,结果是找不到Ant的BuildLogger类,后来又用wlclient等等,都是不成功,在google搜索和查阅官方文档后,得知需用weblogic.jar才可完成服务器启动相关的任务,即使是wlfullclient也不支持这些。再运行StandaloneTest,得到如下异常:

java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at com.bea.xbean.validator.Validator.validateAtomicType(Validator.java:1323)
at com.bea.xbean.validator.Validator.validateSimpleType(Validator.java:1266)
at com.bea.xbean.validator.Validator.validateSimpleType(Validator.java:1202)
at com.bea.xbean.validator.Validator.handleText(Validator.java:829)
at com.bea.xbean.validator.Validator.textEvent(Validator.java:814)
at com.bea.xbean.validator.Validator.nextEvent(Validator.java:244)
at com.bea.xbean.validator.ValidatingXMLStreamReader.validate_event(ValidatingXMLStreamReader.java:656)
at com.bea.xbean.validator.ValidatingXMLStreamReader.next(ValidatingXMLStreamReader.java:546)
永驻空间不足,看来还得需要设置一下,添加-XX:MaxPermSize=512m 这个配置,可以使Perm size增加,如图:


再运行就得到了预期的结果:





猜你喜欢

转载自blog.csdn.net/fengqiuzhihua/article/details/8832354