今天在测试刚写完的代码时,当触发到某一action时,发现webwork抛出以下异常:
[ERROR] - [2009-03-12 14:27:59]: (ServletDispatcher.java:234)--Could not execute action
com.opensymphony.xwork.XworkException: Unable to instantiate Action, com.huawei.nsm.outsrc4.action.CertAction, defined for 'formDataQuery' in namespace '/outsrc4/cert'null
with nested exception
java.lang.NullPointerException
at com.opensymphony.xwork.DefaultActionInvocation.createAction(DefaultActionInvocation.java:220)
at com.opensymphony.xwork.DefaultActionInvocation.init(DefaultActionInvocation.java:272)
at com.opensymphony.xwork.DefaultActionInvocation.<init>(DefaultActionInvocation.java:65)
at com.opensymphony.xwork.DefaultActionInvocation.<init>(DefaultActionInvocation.java:58)
at com.opensymphony.xwork.DefaultActionProxyFactory.createActionInvocation(DefaultActionProxyFactory.java:32)
at com.opensymphony.xwork.DefaultActionProxy.prepare(DefaultActionProxy.java:124)
at com.opensymphony.xwork.DefaultActionProxy.<init>(DefaultActionProxy.java:75)
at com.opensymphony.xwork.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:45)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:227)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
.....
with nested exception java.lang.NullPointerException
java.lang.NullPointerException
at com.huawei.nsm.outsrc4.dao.impl.CertLogDaoImpl.<init>(CertLogDaoImpl.java:45)
at com.huawei.nsm.outsrc4.dao.impl.CertDaoImpl.<init>(CertDaoImpl.java:56)
......
原因是这一句
at com.huawei.nsm.outsrc4.dao.impl.CertLogDaoImpl.<init>(CertLogDaoImpl.java:45)
webwork 无法初始化CertLogDaoImpl对象 , 于是找到该类,发现如下语句:
private final static Log _log = LogFactory.getLog(CertLogDaoImpl.class);
private UserUtil userUtil = (UserUtil)ServletActionContext.getContext().getSession().get("userUtil");
CertLogDaoImpl对象包含一个 userUtil 的成员变量,在初始化CertLogDaoImpl对象时,会先初始化其成员变量,关键是这里,这个uerUtil成员变量使用了 action 的上下文"ServletActionContext.getContext()".
了解webwork中ServletDispatcher原理的人可能知道原因了, 因为ServletDispatcher接受客户端的HTTP请求,将JavaServlet的很多相关对象进行包装,再传给我们的XWork框架,由我们的XWork 框架去解析我们的xwork.xml配置文件,根据配置文件的信息,创建对应的Action,组装并调用相应的拦截器,执行Action,返回执行结果。
因此每次客户端的请求都将调用ServletDispatcher 的 service()方法,
该方法执行顺序如下:
1、通过request请求取得action的命名空间
2、根据servlet请求的Path,解析出要调用该请求的Action的名字(actionName)
3、创建Action上下文(extraContext)
4、根据前面获得的namespace、actionName、extraContext,创建一个ActonProxy
5、执行proxy的execute()方法,根据Action执行返回的值去调用执行相应的Result(返回结果处理)的方法。
现在应该能明白,原来是Action对象实例在ActionContext对象实例之前创建的,所有这样取得ActionContext容器对象就有可能会返回null.
因此解决次问题方法很简单,就是最好不要在成员变量或者是构造方法里调用ActionContext,而把它放在其它方法里.
分享到:
相关推荐
- XWork的核心类`ActionSupport`是所有Struts2 Action的基类,包含了默认的错误处理和验证机制。 - XWork的`OgnlValueStack`是表达式语言OGNL(Object-Graph Navigation Language)在Struts2中的实现,用于在...
详细介绍了XWork: Core 2.2.3的api,欢迎下载。
XWork支持XML和注解两种方式进行配置,XML主要用于定义Action和Interceptor的配置,而注解则为轻量级开发提供了便利,可以直接在Action类或方法上添加注解来指定其行为。 5. **XWork-2.1.5的改进**: 版本2.1.5对...
XWork是一个强大的Action框架,它为Java Web应用程序提供了模型-视图-控制器(MVC)模式的支持。这个框架的主要目标是简化企业级应用的开发,提高代码的可维护性和可扩展性。在本篇文章中,我们将深入探讨XWork的...
OpenSymphony公司的xWork资源包是一款为Java开发者量身打造的重要工具,主要用于构建企业级Web应用程序。这个资源包的核心是XWork框架,它是Struts2框架的基础,旨在提供一种灵活且可扩展的方式来管理应用程序的行为...
XWork是Struts2的核心库,提供了许多底层功能,包括动作调度、类型转换、异常处理和国际化支持等。这个压缩包"**xwork-2.1.2.rar**"包含了XWork框架的版本2.1.2,它是Struts2的重要组成部分。 **XWork核心组件详解...
5. **结果类型(Result)**:Action执行后,根据返回的结果类型,XWork会决定如何渲染响应,如重定向、转发或显示特定的视图。 6. **动态方法调用**:XWork支持动态方法调用,使得Action方法可以根据配置的名称动态...
xwork作为一个强大的Action框架,是Struts2的核心组成部分,它提供了动作处理、类型转换、数据校验等功能,对于Java Web开发者而言,理解其源码有助于提升对MVC架构的理解和应用能力。本文将围绕xwork 2.1.2和2.2.1...
4. **结果管理**:Action执行完毕后,XWork会根据配置的Result类型决定如何展示结果,可以是重定向、转发、渲染JSP页面等。 5. **对象容器**:XWork内置了ObjectContainer,可以用于管理依赖注入,实现对象的生命...
4. **结果(Result)**:Action执行后,通常会有一个结果(Result)。XWork支持多种结果类型,如转发、重定向、流结果等,这使得Action执行后的控制流程更加灵活。 5. **事件驱动模型**:XWork基于事件驱动模型,当...
10. **Exception Handler**:xwork-core提供了一套异常处理机制,当Action执行过程中发生异常时,可以根据预先配置的策略进行处理,如显示错误页面、记录日志等。 以上是xwork-core的主要知识点,理解并熟练运用...
6. **结果与视图**:Action执行后,通常会返回一个结果,这与视图层(如JSP、FreeMarker)相结合,呈现响应。`com.opensymphony.xwork2.Result`接口定义了结果的通用行为。 7. **国际化与本地化**:Xwork支持多语言...
6. **异常处理**:XWork2提供了一套完整的异常处理机制,允许开发者定义如何处理Action执行过程中抛出的异常。这包括捕获特定类型的异常并返回特定的结果,或者全局统一处理异常。 7. **国际化与本地化**:XWork2...
1. **Action管理**:XWork提供了一种Action管理模式,允许开发者定义并执行Action。Action是业务逻辑的载体,处理用户的请求并返回相应的结果。 2. **拦截器机制**:XWork引入了拦截器(Interceptor)的概念,这是...
4. **异常处理**:XWork提供了一套完整的异常处理机制,可以捕获和处理Action执行过程中可能出现的错误。 5. **结果映射**:通过结果映射,开发者可以定义Action执行后返回的视图,如跳转到某个JSP页面或者返回JSON...
5. **结果(Result)**:Action执行完毕后,通常会返回一个结果,这可以是跳转到一个新的页面、重定向、或者渲染一个模板。XWork支持多种结果类型,如JSP、FreeMarker等。 6. **配置管理**:XWork使用XML或注解来...
5. **结果(Result)**:Action执行完毕后,通常会返回一个结果,这个结果可能是重定向、转发、视图渲染等。XWork中的Result接口定义了如何处理这些结果。 6. **配置管理**:XWork的配置文件通常为`xwork.xml`,在...
它能够处理Action的异常,并根据异常类型决定如何返回结果。 6. **动态方法调用**:XWork支持动态方法调用,这意味着Action可以有多个执行方法,而无需预先硬编码在配置文件中。这增加了代码的灵活性和可维护性。 ...
xwork对异常处理进行了封装,当Action执行过程中抛出异常时,会根据配置的异常处理策略进行处理。此外,xwork支持国际化,可以方便地切换不同语言环境,为用户提供多语言支持。 七、总结 通过对xwork-2.0.4源码的...