Struts2 SEOActionNameBuild (The action name cannot be the same as the action suffix [Action]) 终极解决方案

        最近正好在做一个电子商务网站的二次研发,由于需要植入与移动平台对接的SNS系统,客户提出在保留原有项目功能基础上实施扩展,并且要求使用Struts2研发,旧系统模块使用的是Struts1,在直接导入Struts2 jar包后系统发生如下异常:

Line: 64 - org/apache/struts2/convention/SEOActionNameBuilder.java:64:-1
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:431)
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51)
    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.deployDirectory(HostConfig.java:924)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:887)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1147)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.IllegalStateException: The action name cannot be the same as the action suffix [Action]
    at org.apache.struts2.convention.SEOActionNameBuilder.build(SEOActionNameBuilder.java:64)
    at org.apache.struts2.convention.PackageBasedActionConfigBuilder.determineActionName(PackageBasedActionConfigBuilder.java:712)
    at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:535)
    at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:318)
    at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:204)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:374)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:418)
    ... 29 more
2011-8-9 10:22:11 org.apache.catalina.core.StandardContext start
严重: Error filterStart
2011-8-9 10:22:11 org.apache.catalina.core.StandardContext start

 

由于错误名字异常诡异,因此并未立刻解决,google了老半天国外论坛也没结果,于是准备着手自己解决,首先查看了源代码SEOActionNameBuilder

的源代码发现抛出异常的主要原因是以下这句语句:


if (actionName.equals(actionSuffix))

    throw new IllegalStateException("The action name cannot be the same as the action suffix ["+ actionSuffix + "]");

 

那么问题是怎么会导致这个判断成立的呢?

原来Struts的辅助控制器的父类就叫Action,而Struts是属于拦截器机制的,因此很可能会不通过配置文件,而通过拦截请求找到该类,为了证实想法,使用

log4j.properties打印启动[Debug]日志发现

PackageBasedActionConfigBuilder 会解析所有与Action有关的类,于是寻找给类得位置,该类隶属于org.apache.struts2.convention包

那么如果能够禁止PackageBasedActionConfigBuilder 的自动解析,或者禁止该类调用Action那么异常就不会发生了。

找到该类在struts-convention-plugin.jar的struts-plugin.xml中配置,从名字看这是一个可有可无的插件包

打开文件找到以下语句:

<constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>

<constant name="struts.convention.package.locators.disable" value="false"/>

<constant name="struts.convention.package.locators.basePackage" value=""/>

<constant name="struts.convention.exclude.packages"

value="org.apache.struts.*,org.apache.struts2.*,

org.springframework.web.struts.*,

org.springframework.web.struts2.*,

org.hibernate.*"/>

原来问题出在这个文件的配置,该文件明确表明了会检索以action,actions,struts,struts2的名字检索对应的jar包,那么org.apache.struts.Action自然而然会被解析。

发生异常也是理所当然的,那么我们打开自己的struts.xml文件修改常量,因为项目的struts.xml的配置是高于

插件配置的,更改如下:

<constant name="struts.convention.package.locators" value="actions,struts2"/>

表示插件只对actions和struts2包感兴趣,于是乎异常被解决了。

当然如果表示对使用(struts-convention-plugin.jar)压力很大的童鞋们,可以考虑直接删除该jar包不使用,异常一样可以解决。

最后要说的是:

Struts2和Struts1并存一个项目,功能无互访性,而且也不发生Struts2组件调用Struts1的Action的话,没必要使用struts2提供的Struts1-plugin组件实施集成的。

而且发生这个异常也不要想当然的认为将所有Action类得名字中去除Action关键字就能解决。


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值