尽管存在方法,Tomcat嵌入式servlet为javax.servlet.ServletContext setInitParameter(String,String)抛出NoSuchMethodException

时间:2015-02-19 03:07:55

标签: java maven tomcat servlets

我正在启动嵌入式tc7(已尝试过7.0.26和7.0.59)来运行集成测试。我已经在主项目pom(其中包含集成模块)中指定了我想使用javax.servlet至少2.5(也试过3.1.0)并且我已经进入调试器尝试跟随会发生什么,但在调用

时,NoSuchMethodException内的ServletContext.mergeParameters()始终会失败
    ServletContext sc = getServletContext();
    for (Map.Entry<String,String> entry : mergedParams.entrySet()) {
        sc.setInitParameter(entry.getKey(), entry.getValue());    // <---this one
    }

我设置了各种断点,并没有表明存在问题。我甚至使用停止该行的程序并在NetBeans表达式求值程序中使用反射无效 - 反射工作!

java.lang.reflect.Method[] ms = sc.getClass().getMethods();
java.lang.reflect.Method sip = null;
for (java.lang.reflect.Method m : ms) {
  if ("setInitParameter".equalsIgnoreCase(m.getName()) {
    sip = m;
  }
}

sip.invoke(sc, entry.getKey(), entry.getValue());

返回 true ,第一次和 false 后续时间,正如使用相同键时方法所期望的那样。

我已经检查了类路径,只看到了这些最​​新版本的库。我必须包含一个依赖于servlet-api的专有依赖,但是我在pom的dependencyManagement部分添加了一个排除,所以它也应该只使用2.5(或3.1.0 - 既不起作用)。我已经检查了根的依赖树以及集成模块,并且没有看到任何陈旧或旧的残差。

我正在寻找任何调试技巧,以帮助找到罪魁祸首或其他方式来包含/排除这个版本的正确版本。它在运行实际服务器(它不使用嵌入式tomcat)时似乎没有问题,但我希望我的测试工作,甚至只是理解wtf正在进行。

我会回答所有问题,因为我确信这不太清楚。可悲的是,我无法提供运行代码来演示,无论是现在还是刚才。我将尝试在没有专有jar的情况下重现场景。

tl; dr(ish) - org.apache.catalina.core.StandardContext有一个调用mergeParameters()的私有方法getServletContext().setInitParameter(String, String)。返回的ServletContextApplicationContextFacade,似乎有这种方法,可以使用反射调用方法,但直接调用throws NoSuchMethodException时...请帮我找其他方法调试或找出 REAL 类(没有方法)。

0 个答案:

没有答案
相关问题