免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3715 | 回复: 8
打印 上一主题 下一主题

Struts怪异问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-11 18:43 |只看该作者 |倒序浏览
有这么一个Struts工程,myeclipse开发,部署到Tomcat,一切正常
然而把它部署到weblogic(版本为8.1),运行后却抛出:

  1. 2006/04/11 18:17:42 org.apache.struts.util.RequestUtils createActionForm
  2. SEVERE: Error creating form bean of class com.esprit.struts.form.LoginForm
  3. java.lang.NullPointerException
  4.         at org.apache.struts.config.FormBeanConfig.createActionForm(FormBeanConfig.java:212)
  5.         at org.apache.struts.util.RequestUtils.createActionForm(RequestUtils.java:292)
  6.         at org.apache.struts.util.RequestUtils.createActionForm(RequestUtils.java:191)
  7.         at org.apache.struts.taglib.html.FormTag.initFormBean(FormTag.java:477)
  8.         at org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:457)
  9.         at jsp_servlet._pages.__login._jspService(__login.java:278)
  10.         at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
  11.         at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1072)
  12.         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)
  13.         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)
  14.         at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:322)
  15.         at weblogic.servlet.jsp.PageContextImpl.forward(PageContextImpl.java:150)
  16.         at org.apache.struts.taglib.logic.ForwardTag.doForward(ForwardTag.java:121)
  17.         at org.apache.struts.taglib.logic.ForwardTag.doEndTag(ForwardTag.java:105)
  18.         at jsp_servlet.__index._jspService(__index.java:148)
  19.         at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
  20.         at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1072)
  21.         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)
  22.         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)
  23.         at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6981)
  24.         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
  25.         at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
  26.         at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892)
  27.         at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766)
  28.         at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
  29.         at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
复制代码

跟踪调试发现Tomcat下,FormBeanConfig里的formBeanClass()得到了实例,而weblogic下,FormBeanConfig里的formBeanClass()没得到实例
把FormBeanConfig中的createActionForm()函数和formBeanClass()函数也贴出来:

  1. public ActionForm createActionForm(ActionServlet servlet)
  2.         throws IllegalAccessException, InstantiationException {

  3.         Object obj = null;

  4.         // Create a new form bean instance
  5.         if (getDynamic()) {
  6.             obj = getDynaActionFormClass().newInstance();
  7.         } else {
  8.             obj = formBeanClass().newInstance();
  9.         }

  10.         ActionForm form = null;
  11.         if (obj instanceof ActionForm) {
  12.             form = (ActionForm)obj;
  13.         } else  {
  14.             form = new BeanValidatorForm(obj);
  15.         }

  16.         form.setServlet(servlet);

  17.         if (form instanceof DynaBean &&
  18.             ((DynaBean)form).getDynaClass() instanceof MutableDynaClass) {
  19.             DynaBean         dynaBean  = (DynaBean)form;
  20.             MutableDynaClass dynaClass = (MutableDynaClass)dynaBean.getDynaClass();

  21.             // Add properties
  22.             dynaClass.setRestricted(false);
  23.             FormPropertyConfig props[] = findFormPropertyConfigs();
  24.             for (int i = 0; i < props.length; i++) {
  25.                 dynaClass.add(props[i].getName(), props[i].getTypeClass());
  26.                 dynaBean.set(props[i].getName(), props[i].initial());
  27.             }
  28.             dynaClass.setRestricted(isRestricted());

  29.         }

  30.         return form;

  31.     }
复制代码


  1. protected Class formBeanClass() {

  2.         ClassLoader classLoader =
  3.             Thread.currentThread().getContextClassLoader();
  4.         if (classLoader == null) {
  5.             classLoader = this.getClass().getClassLoader();
  6.         }
  7.         try {
  8.             return (classLoader.loadClass(getType()));   //问题出在这,Tomcat下这个返回正常,而weblogic下却进了catch!
  9.         } catch (Exception e) {
  10.             return (null);
  11.         }

  12.     }
复制代码

请各位帮忙分析下,这是什么原因所致?

论坛徽章:
0
2 [报告]
发表于 2006-04-11 20:20 |只看该作者
行数我们也不知道到,从这开始吧, FormBeanConfig.java:212

你说是这段有问题吗?


  1.         try {
  2.             return (classLoader.loadClass(getType()));   //问题出在这,Tomcat下这个返回正常,而weblogic下却进了catch!
  3.         } catch (Exception e) {
  4.             return (null);
  5.         }

复制代码



把所有的 Exception 的详细信息都显示出来

e.printStrackTrace(); 看看

是classLoader依然还是是null ,还是 getType() 有问题

[ 本帖最后由 wobushiwo 于 2006-4-11 20:23 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-04-11 21:03 |只看该作者
我也想把所有错误信息都打印出来呢
但是这个是源码,好像是没法弄
我看了下getType()能正常取到值,貌似classLoader这个函数找不到getType()得到的这个class

论坛徽章:
0
4 [报告]
发表于 2006-04-12 12:09 |只看该作者
别沉了,顶起来!

论坛徽章:
0
5 [报告]
发表于 2006-04-12 13:34 |只看该作者
1 你确定 getType() 有返回值?而且不是 null ?

这样的话,那你

自己建个  ClassLoader ,确保不会null

loadClass(getType());

或你知道 getType() 返回的类名,直接

loadClass(类名);

看有没问题,假如是 ClassNotFoundException ,那就是要 load 的class 没在 CLASSPATH 的范围之内

论坛徽章:
0
6 [报告]
发表于 2006-04-12 14:45 |只看该作者
getType()通过debug能看到得到的值,debug跟到return (classLoader.loadClass(getType())); 时, classLoader这个类跟不进去了,不知道为什么
应该是抛ClassNotFoundException异常 ,但是WEB-INF/classes目录下有我这个class的,不知为什么会找不到?
自己建一个ClassLoader ,没那么简单吧?

论坛徽章:
0
7 [报告]
发表于 2006-04-12 14:53 |只看该作者
从你出错信息上看 我觉得不是getType问题
是不是classloader 对象是null啊 如果是loadclass 方法内部出错的话 错误信息应该追踪到classloader内部
我感觉是没有获取到classloader

[ 本帖最后由 tong0245 于 2006-4-12 14:55 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-04-12 15:02 |只看该作者
原帖由 esprit 于 2006-4-12 14:45 发表
getType()通过debug能看到得到的值,debug跟到return (classLoader.loadClass(getType())); 时, classLoader这个类跟不进去了,不知道为什么
应该是抛ClassNotFoundException异常 ,但是WEB-INF/classes目录下有 ...



什么不简单?

建立一个ClassLoader只是为了调试你原来得到的 ClassLoader 是不是为null 而已,不是要你建立一个

ClassLoader去顶替原来的

或加一判断


  1. if (classLoader == null) {
  2.             classLoader = this.getClass().getClassLoader();
  3. }
  4. 下面就直接使用 classLoader  了,但在这里调试一下,这时是不是还是null
复制代码



假如 classLoader 不为 null,而且 getType() 没问题,有返回值,

loadClass 只能抛出 ClassNotFoundException  不会抛抛 NullPoint例外

论坛徽章:
0
9 [报告]
发表于 2006-04-13 00:17 |只看该作者
第一确认一下是否该class在cl上
第二是着用不同的classloader加载一下,web server一般都使用自己的类装载器
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP