Unable to instantiate Action错误的解决

本文探讨了一个关于Struts2框架中Action实例化失败的问题,并详细解释了导致这一问题的原因及解决方案。核心在于Action对象实例在ActionContext对象实例之前创建,从而可能导致获取到null值。

Unable to instantiate Action, ....action.CertAction, defined for '...' in namespace '/...'null
 
原因是变量定义:
 
  private UserUtil userUtil = (UserUtil)ServletActionContext.getContext().getSession().get("userUtil");

关键是这里,这个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,而把它放在其它方法里.

解决WebSphere Application Server (WAS) 访问首页报错 “unable to instantiate action” 的问题,可从多个方面进行排查和处理: ### 检查类路径 - 确保所有必需的类文件都在WAS的类路径中。缺失相关的类文件会导致无法实例化Action。查看应用程序的 `WEB-INF/lib` 目录,确认所需的JAR包都已包含。同时,检查WAS的全局类路径设置,保证没有遗漏必要的库。 ```plaintext # 示例检查WEB-INF/lib目录下的JAR包 ls /path/to/your/application/WEB-INF/lib ``` ### 检查Action类 - 检查Action类是否存在编译错误,或者是否有语法错误。可以重新编译项目,查看是否有报错信息。同时,要确保Action类有一个无参的构造函数,因为WAS在实例化Action时通常使用默认构造函数。 ```java // 示例Action类,确保有无参构造函数 public class MyAction { public MyAction() { // 无参构造函数 } public String execute() { return "success"; } } ``` ### 检查配置文件 - 检查Struts或其他框架的配置文件,确保Action的配置正确。例如,检查 `struts.xml` 文件中Action的定义是否准确,包括类名、命名空间等信息。 ```xml <!-- 示例struts.xml中的Action配置 --> <action name="myAction" class="com.example.MyAction"> <result name="success">/success.jsp</result> </action> ``` ### 检查依赖冲突 - 可能存在依赖冲突,导致某些类无法正确加载。可以使用Maven或Gradle等构建工具来管理依赖,检查是否有版本冲突的情况。 ```plaintext # 使用Maven查看依赖树,检查是否有冲突 mvn dependency:tree ``` ### 检查WAS日志 - 查看WAS的日志文件,如SystemOut.log和SystemErr.log,从中获取更详细的错误信息。日志中可能会包含具体的异常堆栈信息,帮助定位问题。 ```plaintext # 示例查看SystemOut.log文件 cat /path/to/was/logs/server1/SystemOut.log ``` ### 重启WAS服务 - 有时候,简单地重启WAS服务可以解决一些临时的问题。可以通过WAS的管理控制台或者命令行工具来重启服务。 ```plaintext # 使用命令行重启WAS服务 /opt/IBM/WebSphere/AppServer/bin/stopServer.sh server1 /opt/IBM/WebSphere/AppServer/bin/startServer.sh server1 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值