Struts2的2.5版本异常There is no Action mapped for namespace[/] and action name []
2018-02-12 17:26
459 查看
这两天学maven时遇到了一个另我怀疑人生的bug。那就是访问action的方法时提示
首先我说一下我的错误原因。因为学习maven,于是本着什么东西都是高版本的好的思想,jdk要配置1.8的,什么jar包都去中央仓库找最新版本的坐标,没曾想使用
首先表态一句,当你百度半天都找不到原因的时候,
Internal Changes
由上述可知,
使用log4j日志中在截获请求URL并准备执行对应方法时也会有
通俗来说就是从version2.5以后,struts2的请求URL默认只能访问action中的方法名在
那小伙伴可能就不舒服了,我之前随意定义action的方法名习惯了,不想改怎么办?当然了,这个改版并没有那么死板,默认情况下方法名只能是以上的,你想定义额外的可以在struts.xml中配置类似
的全局可访问方法名,但这个操作不是覆盖而是增量,即在默认的基础上增加方法名。同样也支持在你的 action 上使用 @AllowedMethods 注解,不过这个注解对应的具体版本还需要到官网上找,但最新版本肯定是支持的。
那我还想沿用之前的通配符匹配action和action_method的方式,那岂不是很麻烦?
这个问题可以通过正则匹配所有方法名来解决:
所以说啊,我这两天没有白痛苦。至少我明白了一下几个点:
1、第三方框架、工具并不是用更高的版本更好,在用它之前你得先熟悉它,不然他的该本颠覆了你之前的认知那会很头疼的,像我,就被这个bug卡了两天。
2、不要百度、知乎提问什么的。直接去官网看reference,那是最权威的,也能锻炼你的编程逻辑思维。里面介绍了技术的使用、技术的形成、为什么要这么用,这么用有什么好处。
3、要持之以恒,这两天我的内心是崩溃的,这么个小问题卡了我这么久,一度想放弃。好在我坚持下来了。累了你可以休息,但千万不要放弃。
4、要缕清排错思维,不能毫无头绪的东改改西查查,先确认具体是哪一块,再去精准定位。比如是不是环境不对、是不是配置文件写错了、是不是访问路径不对。如果不是自身问题,那一定是环境问题,比如jar包有没有导、版本有没有冲突的、再就是我今天提到的高版本jar包的特性。
There is no Action mapped for namespace[/] and action name []的错误信息。我检查了
struts.xml的文件名、存放的位置(
src下),
继承的package为struts-default。完全找不到是因为自己的配置出的错,莫名其妙。
首先我说一下我的错误原因。因为学习maven,于是本着什么东西都是高版本的好的思想,jdk要配置1.8的,什么jar包都去中央仓库找最新版本的坐标,没曾想使用
struts2.5版本的jar导致我困惑了将近两天时间。下面进去正题。
首先表态一句,当你百度半天都找不到原因的时候,
官网的reference真的是个好东西,英文单词生词并没有我想像的那么生僻,实在英语差的同学也可以下载火狐的
翻译侠插件,选中单词即可翻译。下面贴一段
struts2的官方2.5版本的
Version Notes也就是新特性和改版。
Internal Changes
New security option was added - Strict Method Invocation (also known as Strict DMI), see WW-4540
Struts 2 already supports Strict DMI but it's disabled by default.Strict DMI should be always enable to allow access only specific methods.
由上述可知,
struts2从Version2.5开始增加了严格的DMI机制。在version2.5的struts核心包中,struts-default.xml的末尾有这么一行代码:
<global-allowed-methods> execute,input,back,cancel,browse,save,delete,list,index </global-allowed-methods>
使用log4j日志中在截获请求URL并准备执行对应方法时也会有
Defined allowed methods: [LiteralAllowedMethod{allowedMethod='cancel'}, LiteralAllowedMethod{allowedMethod='input'}, LiteralAllowedMethod{allowedMethod='save'}, LiteralAllowedMethod{allowedMethod='back'}, LiteralAllowedMethod{allowedMethod='index'}, LiteralAllowedMethod{allowedMethod='list'}, LiteralAllowedMethod{allowedMethod='execute'}, LiteralAllowedMethod{allowedMethod='delete'}, LiteralAllowedMethod{allowedMethod='browse'}]
通俗来说就是从version2.5以后,struts2的请求URL默认只能访问action中的方法名在
cancel、input、save、back、index、list、execute、delete、browse之中的方法。否则就抛404异常。回想一下,以前用户请求的URL如果与你的action和action的方法不匹配似乎是返回struts2的错误模板页面。这样做的目的可能是规范请求URL,提高安全性和规则标准性。
那小伙伴可能就不舒服了,我之前随意定义action的方法名习惯了,不想改怎么办?当然了,这个改版并没有那么死板,默认情况下方法名只能是以上的,你想定义额外的可以在struts.xml中配置类似
<global-allowed-methods> findAll,update,add,save </global-allowed-methods>
的全局可访问方法名,但这个操作不是覆盖而是增量,即在默认的基础上增加方法名。同样也支持在你的 action 上使用 @AllowedMethods 注解,不过这个注解对应的具体版本还需要到官网上找,但最新版本肯定是支持的。
那我还想沿用之前的通配符匹配action和action_method的方式,那岂不是很麻烦?
这个问题可以通过正则匹配所有方法名来解决:
<allowed-methods>regex:.*</allowed-methods>
所以说啊,我这两天没有白痛苦。至少我明白了一下几个点:
1、第三方框架、工具并不是用更高的版本更好,在用它之前你得先熟悉它,不然他的该本颠覆了你之前的认知那会很头疼的,像我,就被这个bug卡了两天。
2、不要百度、知乎提问什么的。直接去官网看reference,那是最权威的,也能锻炼你的编程逻辑思维。里面介绍了技术的使用、技术的形成、为什么要这么用,这么用有什么好处。
3、要持之以恒,这两天我的内心是崩溃的,这么个小问题卡了我这么久,一度想放弃。好在我坚持下来了。累了你可以休息,但千万不要放弃。
4、要缕清排错思维,不能毫无头绪的东改改西查查,先确认具体是哪一块,再去精准定位。比如是不是环境不对、是不是配置文件写错了、是不是访问路径不对。如果不是自身问题,那一定是环境问题,比如jar包有没有导、版本有没有冲突的、再就是我今天提到的高版本jar包的特性。
相关文章推荐
- eclipse中配置struts2出现There is no Action mapped for namespace [/] and action name [Login] associated wi
- struts2用注解开发出错一 There is no Action mapped for namespace [/] and action name [zhujie] associated with
- struts2的异常There is no Action mapped for namespace / and action name
- There is no Action mapped for namespace [/] and action name [] associated with context path [/struts2web1].
- struts2配置错误 There is no Action mapped for namespace [/] and action name [] associated with context
- 使用Struts2动态方法调用时(DMI)出现There is no Action mapped for namespace [/user] and action name [user!add] 问题
- struts2报错:There is no Action mapped for namespace [/] and action name [userAction!add]
- struts2 - There is no Action mapped for namespace [/login] and action name [login!loginInput] ...
- eclipse中配置struts2出现eclipse中配置struts2出现There is no Action mapped for namespace [/] and action name [L
- eclipse中配置struts2出现There is no Action mapped for namespace [/] and action name [Login] associated wi
- IDEA配置Struts2出现There is no Action mapped for namespace [/] and action name [login]
- struts2出现There is no Action mapped for namespace [/] and action name [Login] associated wi
- MyEclispe配置struts2出现There is no Action mapped for namespace [/] and action name [user_all]...问题处理
- There is no Action mapped for namespace [/] and action name [struts2Test!test] associated with conte
- struts2用注解开发出错二 There is no Action mapped for namespace [/] and action name [zhujie] associated with
- [转]struts2的异常There is no Action mapped for namespace / and action name
- eclipse中配置struts2出现There is no Action mapped for namespace [/] and action name [Login] associated w
- eclipse中配置struts2出现There is no Action mapped for namespace [/] and action name [Login] associated w
- maven jetty struts异常 There is no Action mapped for namespace [/] and action name [] associated with context path
- 每当使用struts2动态方法调用时,总是出现错误:There is no Action mapped for namespace [/user] and action name [user!add]