`
white_crucifix
  • 浏览: 97358 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在使用StrtusSpringTestCase时调用getActionProxy时抛nullpointer的原因

阅读更多
给我这孱弱的博客添一篇文章吧……
=========================================================================

最近没事想玩一下Struts2的单元测试,然后查了下一般可以用StrutsSpringTestCase来做,这个类继承自StrutsTestCase。在网上搜了下简单的例子。

因为struts测试库是模拟出request等web环境,所以不需要跑在tomcat里,可以直接run junit。模拟action的第一步就是调用getActionProxy()方法。如:
ActionProxy proxy = getActionProxy("/login.action");


然后一跑就给我报错。
Unable to instantiate Action, personAction,  defined for 'login' in namespace '/'personAction
.
.
.
.
Caused by: java.lang.ClassNotFoundException: personAction
.
.
.	


这个错一般都是由于spring配置错误或位置存放错误导致了没有帮UserAction创建之类的。然后反复检查了applicationContext.xml, web.xml甚至是struts.xml,没发现什么问题。最重要的是项目在tomcat里运行完全正常。总觉得配置文件应该不会有问题。于是就纳闷了,开始满世界的网上搜。但是结果不理想。无论是国内还是国外的资料似乎都不能帮我解决问题。难得在国外的论坛上找到和我一样问题的人,结果没有人解答。国内的搜索,事后回想其实还是有正确解答的。只不过感觉没说清楚。

于是没办法,只能开始debug源码,希望能有点进展。最后通过调试struts spring源码终于找到问题所在了。 当我绕了一大圈debug到StrutsSpringTestCase类里,看到第一行写了:
static final String DEFAULT_CONTEXT_LOCATION ="classpath*:applicationContext.xml" 

一瞬间蛋都碎了……

classpath*:applicationContext.xml

spring默认读取/WEB-INF下的app...xml,居然TestCase默认读取classpath下…… 而我的app...xml放在了默认的/WEB-INF/下。那当然创建不了自己定义的bean了。此时我试了一下,将app...xml搬到了类路径下,果然就成功了。

本来这样就想算了,后来想想,能不能把StrutsSpringTestCase配置成读取我自定义的路径。

 protected void setupBeforeInitDispatcher() throws Exception {
        // only load beans from spring once
        if (applicationContext == null) {
            GenericXmlContextLoader xmlContextLoader = new GenericXmlContextLoader();
            applicationContext = xmlContextLoader.loadContext(getContextLocations());
        }

        ........
}
protected String[] getContextLocations() {
        return new String[] {DEFAULT_CONTEXT_LOCATION};
    }


这里加载上下文的方法loadContext直接读取了那个默认的静态变量DEFAULT_CONTEXT_LOCATION,也就是"classpath*:applicationContext.xml"。而loadContext方法的实现不断深入,关于路径变量locations都是一些其他的判断和字符上的改变,没有我预想中的如果判断为空,再怎么怎么。换句话说,loadContext方法处已经将最终的路径给定死了。而且似乎没有去读web.xml中的内容(这毕竟不是真的web容器),所以我即使在web.xml中配置了路径也没有生效。


其实最后两点我还是对自己有点怀疑。觉得这struts测试lib也不能hardcode成这样,默认是好事。。也得可配,至少读一下web.xml吧
分享到:
评论

相关推荐

    Null Pointer Error(处理方案).md

    空指针错误(Null Pointer Error)是编程中非常普遍的一种错误类型,尤其在如Java这类静态类型语言中。该错误通常发生在程序试图访问一个未被分配内存地址的引用变量,或者尝试调用一个未被实例化的对象的方法时。空...

    NullPointerError.md

    在编程中,NullPointerException(空指针异常)是一种常见的运行时错误,当程序试图访问或操作一个null(空)对象的属性或方法时会抛出。Java等编程语言通常会出现这种错误,因为Java语言在访问对象的成员之前需要对...

    pb调用webservice提示参数为Null的解决办法

    其他开发工具调用都没问题,pb调用就提示参数为null,经过多方努力比较,此方法确实可行。

    Null Pointer Error(解决方案).md

    在Java等编程语言中,当尝试调用一个null对象的方法或访问其属性时,程序就会抛出空指针异常(NullPointerException),导致程序崩溃。空指针错误不仅仅局限于Java,它是多种编程语言共有的问题。因此,理解并掌握...

    java用JNA调用dll实例,包含各种参数调用

    Java语言在与操作系统底层交互时,通常会遇到需要调用动态链接库(DLL)的情况,尤其是在Windows平台上。Java Native Access(JNA)是Java平台上的一个开源库,它提供了直接调用系统DLL函数的能力,无需编写C代码...

    进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,

    编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...

    ERR-NULL-POINTER(解决方案).md

    Java中引发空指针异常(NullPointerException)的常见原因是在对象为null时尝试调用对象的方法或访问其属性。为了避免这种异常,可以显式地在使用对象之前检查它是否为null,如下所示: ```java Object obj = ...

    VC++调用大漠插件

    4. **错误处理**:在调用大漠插件的API时,应始终检查返回值,以便处理可能出现的错误。例如,`LoadLibrary()`可能会返回NULL,表示加载失败,此时需要通过`GetLastError()`获取错误代码并进行相应的错误处理。 5. ...

    C#中在一个窗体里调用另一个窗体的方法

    当需要在一个窗体中调用另一个窗体时,可以通过实例化目标窗体的方式来实现。例如,在`FormReportList`中创建`FormPubs`对象: ```csharp public FormPubs fp; public FormReportList(FormPubs f) { fp = f; ...

    使用java调用jenkins api

    在调用Jenkins API时,可能会遇到各种错误,如网络问题、权限不足、API版本不兼容等。需要正确处理HTTP状态码和返回的错误信息。 10. **示例代码**: 压缩包中的`jenkinsApi`文件可能包含一个简单的Java示例,...

    httpClient调用webservice接口

    ### 使用HttpClient调用WebService接口详解 #### 一、概述 在现代软件开发中,Web服务(尤其是WebService)作为实现系统间交互的一种重要手段被广泛采用。WebService提供了通过HTTP协议进行远程过程调用的能力,...

    java 调用webservice使用HttpClient和XFire两种方式

    本文将详细介绍如何使用HttpClient和XFire这两种不同的库来调用Web Service,特别是针对短信接口的调用。 首先,让我们了解Web Service的基本概念。Web Service是一种基于互联网的、平台无关的交互方式,它允许不同...

    C# 调用C++DLL(函数参数包含指针)

    本篇文章将深入探讨如何在C#中调用一个C++DLL,特别是当DLL函数参数中包含指针时的处理方法。 首先,理解C#与C++之间的互操作性是关键。.NET框架提供了一个名为P/Invoke(Platform Invoke)的机制,允许C#代码调用...

    使用ShellExecuteEx调用控制台程序(exe)并传入多个参数

    需要注意的是,由于`ShellExecuteEx`不保证按照参数列表的顺序传递参数,因此在编写被调用的控制台程序时,应当使用固定参数位置或解析命令行字符串来获取参数。 在实际应用中,可能还需要考虑错误处理,例如当`...

    c++如何采用com组件的方法直接调用动态库

    COM 组件可以是动态链接库(DLL),在 C++ 中调用 COM 组件可以使用智能指针来简化操作。 在 C++ 中调用 COM 组件的方法有多种,下面我们将详细介绍三种常用的方法: 方法一:使用 #import 导入类型库 使用 #...

    Winform中使用CefSharp和js互相调用方法

    Winform中使用CefSharp和js互相调用方法,Winform中使用CefSharp和js互相调用方法,Winform中使用CefSharp和js互相调用方法,Winform中使用CefSharp和js互相调用方法 vs2019.debug目录下有cef所需要的文件,在其他...

    C++调用C#的DLL实例程序

    2. 导出C#方法:在C#中,使用`[DllImport]`特性标记需要被C++调用的方法。然而,对于C# DLL,我们通常使用`[System::Runtime::InteropServices::DllImport]`,并指定`CharSet = CharSet::Auto`,因为C#方法默认使用...

    C#调用大漠插件

    本例子是一个C#类库,可以发布为DLL文件给其他项目调用;...使用完毕后需调用:dm.close();释放大漠对象,否则资源会占用过多 注意: 需要.net FrameWork4.5环境 开发工具为:visual studio 2013

    java调用C#封装的dll方法

    - 确保启用公共语言运行时支持(/clr),以便C++可以调用托管的C# DLL。 - **重新生成项目:** 编译后得到`COMTest_Bridge.dll`文件。 **3. Java调用C++ DLL:** - **创建Java项目:** 在Java环境中创建新项目。...

    c#调用c++DLL,dll有二维数组

    在C#中调用C++编写的动态链接库(DLL)是一项常见的跨语言编程任务,尤其是在需要利用C++的高效性能或已有的C++代码库时。本篇将详细讲解如何在C#中调用一个包含二维数组的C++DLL。 首先,我们需要了解C#与C++之间...

Global site tag (gtag.js) - Google Analytics