关于waf,请教各位高手。

03-07-31 TigerZ

我最近辛辛苦苦把petStore研究了一编,现在想模仿着扩展waf用在公司的项目里,但是在使用中发现StateMachine中用Class.forName不能找到我定义的类,我甚至在前面加入import语句也不行。

在WAF里,StateMachine(java类)被一个作为EJBController的sessionBean调用(Local接口),使用Class.forName方法实例化一个EJBAction类,但是部署上weblogic上后此处始终抛出java.lang.ClassNotFoundException。为什么呢?我将war和jar打成一个ear一起包部署的。

此情况我在其他地方也遇到过。类似一个stateful session bean作为类工厂,使用完整类名实例化具体的业务类。

我的J2EE水平有待提高,所以我不能确定是哪里的问题,只是怀疑是部署的问题,使session Bean不能找到业务类,但是?Why? 怎么做呢? 诚心请教各位高手!!!小弟先谢了!!!

环境:jbuilder8 + weblogic7

TigerZ
2003-07-31 09:49

//EJBController:

/**

* EJB控制器EJB的Session Bean实现。

* 更多的细节参考StateMachine。

*/

public class EJBControllerLocalEJB implements SessionBean {

protected StateMachine sm;

protected SessionContext sc;

public EJBControllerLocalEJB() {}

public void ejbCreate() {

sm = new StateMachine(this, sc);

}

/** 就是这里调用了StateMachine, 此时ev中包含了完整的EJBAction类路径*/

public EventResponse processEvent(Event ev) throws EventException {

return (sm.processEvent(ev));

}

public void setSessionContext(SessionContext sc) {

this.sc = sc;

}

public void ejbRemove() {

sm = null;

}

public void ejbActivate() {}

public void ejbPassivate() {}

}

//这是StateMachine部分源码

public class StateMachine

implements java.io.Serializable {

private EJBControllerLocalEJB ccejb;

private HashMap attributeMap;

private HashMap actionMap;

private SessionContext sc;

public StateMachine(EJBControllerLocalEJB ccejb, SessionContext sc) {

this.ccejb = ccejb;

this.sc = sc;

attributeMap = new HashMap();

actionMap = new HashMap();

}

//操作事件

public EventResponse processEvent(Event ev) throws EventException {

//取得EJBAction的类名

String actionName = ev.getEJBActionClassName();

EventResponse response = null;

if (actionName != null) {

EJBAction action = null;

try {

//控制EJBAction的instance,调用过就放入actionMap,待用

if (actionMap.get(actionName) != null) {

action = (EJBAction) actionMap.get(actionName);

}

else {

//实例化具体的EJBAction

//就是这里出的错!actionName是完整且正确的类路径!!!

action = (EJBAction) Class.forName(actionName).newInstance();

actionMap.put(actionName, action);

}

}

catch (Exception ex) {

System.err.println("StateMachine: error loading " + actionName + " :" +

ex);

}

if (action != null) {

action.init(this);

// do the magic

action.doStart();

response = action.perform(ev);

action.doEnd();

}

}

return response;

}

banq
2003-07-31 18:03

"使用Class.forName方法实例化一个EJBAction类,但是部署上weblogic上后此处始终抛出java.lang.ClassNotFoundException。"

你这个问题很早就讨论过,Weblogic和Jboss一样,动态反射时寻找一个Jar包是先从EJB层开始寻找,所以你应该在EJB中将Class.forName的类打包进去。

TigerZ
2003-08-01 11:41

感谢板桥大哥,一句话就点到了,我已经解决。同时也发现Jbuilder中后很多Buge,让我折腾了一上午。再次感谢!