com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法

本文详细解析了Struts2与Spring整合时出现的NullPointerException问题,主要原因是未正确配置Spring的ApplicationContext监听器,文中提供了具体的配置代码以解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://blog.youkuaiyun.com/shinchan_/article/details/37818927

com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法
严重: Exception starting filter struts2
Class: com.opensymphony.xwork2.spring.SpringObjectFactory
File: SpringObjectFactory.java
Method: getClassInstance
Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
 at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437)
 at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:195)
 at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
 at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
 at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
 at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4356)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
 at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:626)
 at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1215)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
 at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
 at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:220)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyResultType(XmlConfigurationProvider.java:530)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addResultTypes(XmlConfigurationProvider.java:501)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:457)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:275)
 at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:111)
 at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:204)
 at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)
 at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:380)
 at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:424)
 ... 20 more
2011-8-28 1:19:47 org.apache.catalina.core.StandardContext start
严重: Error filterStart
2011-8-28 1:19:47 org.apache.catalina.core.StandardContext start

严重: Context [] startup failed due to previous errors


原因一:

      问题处在你导入的“Struts2 Spring Libraries”库下的“Struts2-spring-plugin-2.2.1.jar”jar包下的struts-plugin.xml里。如下图:

       问题出现的具体位置在上图所示的第29行的代码,这段代码如下:

<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
       这表明该插件引入工程后,会自动设置Struts的ObjectFactory为StrutsSpringObjectFactory,从而让Spring的IOC容器来托管Struts的Action。但是在工程的web.xml中没有配置加载spring ApplicationContext相关的listener,从而导致了启动时出现的问题:com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1。

 

原因二及解决方法:

      可能是由于没有用到spring的jar包,而却导入了spring的jar包,从而导致这个错误,将spring没用的jar包删除就可以了;

 

 

二、原因一的解决办法

在工程的web.xml中配置加载spring ApplicationContext相关的listener,配置的代码如下:

 

    <context-param>
        <param-name>
            contextConfigLocation
        </param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>

    </listener>终于解决了这个小问题,记录一下,方便查看和回顾,也希望能帮到遇到这个问题需要寻求帮助的

 

--------------------- 作者:shinchan_ 来源:优快云 原文:https://blog.youkuaiyun.com/shinchan_/article/details/37818927?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/sharpest/p/9770719.html

<think>我们正在处理一个 `java.lang.NoSuchMethodError`,具体是关于 `ognl.Ognl.createDefaultContext` 方法的。同时,错误发生在 `com.opensymphony.xwork2.inject.ContainerBuilder.create` 的第161行。根据引用[4],这通常是由于Struts2版本与OGNL库版本不兼容引起的。 ### 问题分析 - **错误信息**:`NoSuchMethodError: ognl.Ognl.createDefaultContext` 表明在运行时找不到特定签名的方法。这通常是因为编译时使用的库版本与运行时实际加载的库版本不一致。 - **引用[4]明确指出**:Struts2.3.16.3需要搭配OGNL 3.0.6版本,而如果使用了OGNL 3.0(或其他不兼容版本)则会出现此错误。 ### 解决步骤 1. **检查项目依赖**:确认项目中使用的Struts2和OGNL的版本是否匹配。 - 对于Struts2.3.x,必须使用OGNL 3.0.6。 - 对于Struts2.5.x,需要使用OGNL 3.1.x版本。 2. **排除冲突的OGNL依赖**:在构建工具中显式指定正确的OGNL版本,并排除其他传递依赖引入的旧版本。 #### Maven 配置示例 ```xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.16.3</version> <!-- 你的Struts2版本 --> <!-- 排除旧版本的OGNL --> <exclusions> <exclusion> <groupId>ognl</groupId> <artifactId>ognl</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入正确的OGNL版本 --> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.0.6</version> </dependency> ``` #### Gradle 配置示例 ```groovy dependencies { implementation('org.apache.struts:struts2-core:2.3.16.3') { exclude group: 'ognl', module: 'ognl' } implementation 'ognl:ognl:3.0.6' } ``` 3. **验证依赖树**: - 在Maven中运行:`mvn dependency:tree | grep ognl` - 在Gradle中运行:`gradle dependencies | grep ognl` - 确保输出的OGNL版本为3.0.6。 4. **清理和重新部署**: - 清理构建工具的输出(如Maven的`target`目录)。 - 清理应用服务器的缓存(如Tomcat的`work`和`temp`目录)。 ### 原理说明 - 在OGNL 3.0.6中,`Ognl.createDefaultContext`方法有四个参数(Object, MemberAccess, ClassResolver, TypeConverter),而其他版本可能没有相同签名的方法。当Struts2XWork2)在运行时调用这个方法时,如果加载的OGNL库中不存在相应的方法,就会抛出`NoSuchMethodError`[^4]。 ### 验证修复 在应用启动时,可以通过以下代码检查OGNL版本(注意:在生产环境中不建议使用,仅用于调试): ```java public class OgnlVersionChecker { public static void main(String[] args) { try { // 使用反射获取OGNL版本信息 Class<?> ognlVersionClass = Class.forName("ognl.OgnlVersion"); String version = (String) ognlVersionClass.getDeclaredField("VERSION").get(null); System.out.println("OGNL Version: " + version); } catch (Exception e) { e.printStackTrace(); } } } ``` 或者,在日志中查看Struts2启动信息,通常也会显示依赖库的版本。 ### 相关问题 1. 如何查看Maven项目的完整依赖树? 2. Tomcat部署时如何彻底清理旧版本库残留? 3. Struts2升级到最新版本需要注意哪些兼容性问题? 4. 除了OGNL,还有哪些库容易引起Struts2版本冲突? 5. 如何通过Java反射验证类方法是否存在? [^1]: 引用自站内关于OGNL方法实现的说明。 [^2]: 引用自站内关于CompoundRoot对象和OGNL表达式使用的示例。 [^3]: 引用自站内对OGNL功能的描述。 [^4]: 引用自站内关于Struts与OGNL版本兼容性的关键信息。 [^5]: 引用自站内对OGNL基本概念的解释。</think>### 解决 `java.lang.NoSuchMethodError: ognl.Ognl.createDefaultContext` 问题 此错误发生在 `com.opensymphony.xwork2.inject.ContainerBuilder.create` 方法(第161行)中,根本原因是 **Struts2 与 OGNL 库版本不兼容**。根据引用[4],Struts2.3.x 需要特定版本的 OGNL(如 3.0.6),而实际加载的 OGNL 库缺少所需方法签名。 #### 错误原因分析 1. **方法签名不匹配** Struts2.3.x 要求 OGNL 的 `createDefaultContext` 方法包含四个参数: ```java createDefaultContext(Object, MemberAccess, ClassResolver, TypeConverter) ``` 而您项目中加载的 OGNL 库(可能是 3.0.x 或更高版本)可能已删除或修改此方法签名[^4]。 2. **依赖冲突** 其他依赖(如 Spring 或 Hibernate)可能引入了不兼容的 OGNL 版本,导致类加载器加载了错误版本。 #### 解决方案 1. **强制使用兼容版本** 在构建文件中锁定 OGNL 3.0.6(Maven 示例): ```xml <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.0.6</version> <!-- Struts2.3.x 专用版本 --> <!-- 排除其他依赖传递的冲突版本 --> <exclusions> <exclusion> <groupId>ognl</groupId> <artifactId>ognl</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **验证依赖树** 执行命令检查依赖: ```bash mvn dependency:tree | grep ognl ``` 输出应显示: ``` [INFO] | \- ognl:ognl:jar:3.0.6:compile ``` 3. **清理部署环境** 删除 Tomcat 的缓存目录: ```bash rm -rf $CATALINA_HOME/work/* rm -rf $CATALINA_HOME/temp/* ``` 4. **检查 XWork 兼容性** 确保 `xwork-core` 版本与 Struts2.3.x 匹配: ```xml <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> <version>2.3.16.3</version> <!--Struts主版本一致 --> </dependency> ``` #### 版本兼容对照表 | 组件 | 要求版本 | 验证方法 | |--------------|---------------|-----------------------------| | Struts2 | 2.3.x | `struts2-core-2.3.*.jar` | | OGNL | 3.0.6 | 包含四参数`createDefaultContext` | | XWork-core | 2.3.x | 与Struts版本一致 | > **原理说明**:XWork2 的 `ContainerBuilder` 在初始化时(第161行)会调用 OGNL 方法创建表达式上下文。当加载的 OGNL JAR 不包含预期方法签名时,JVM 抛出 `NoSuchPropertyException`[^2]。 #### 验证修复 在代码中添加检查: ```java // 验证OGNL方法是否存在 try { Method method = ognl.Ognl.class.getMethod("createDefaultContext", Object.class, ognl.MemberAccess.class, ognl.ClassResolver.class, ognl.TypeConverter.class); System.out.println("OGNL方法验证通过"); } catch (NoSuchMethodException e) { System.out.println("不兼容的OGNL版本"); } ``` --- ### 相关问题 1. 如何排查 Maven 依赖树中的版本冲突? 2. Struts2 升级到 2.5.x 版本需要注意哪些兼容性问题? 3. 除了 OGNL,XWork2 框架还有哪些核心依赖容易引发版本冲突? 4. 如何在 Tomcat 中彻底清理旧版本库的残留文件? 5. Java 反射如何用于验证类方法的存在性? [^1]: 引用自站内关于OGNL方法实现的说明。 [^2]: 引用自站内关于CompoundRoot对象和OGNL表达式使用的示例。 [^3]: 引用自站内对OGNL功能的描述。 [^4]: 引用自站内关于Struts与OGNL版本兼容性的关键信息。 [^5]: 引用自站内对OGNL基本概念的解释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值