论坛首页 Java企业应用论坛

Struts2 convention plugins 使用中一个大BUG

浏览 7166 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-06  
最近准备试用struts2 的 convention 插件,其中自动映射url的功能很新奇,也省了不少事,不用到处写配置文件了,如果加上spring的announced 比原来更加方便
不过试用中发现一个问题,提请大家讨论,目前已被证明的确是一个bug
比如你在浏览器中键入一个url http://localhost/iweb/dwr/
这个url 是虚拟的,但不映射任何action ,struts2 会替你查找action ,如果找不到就会
引用

There is no Action mapped for action name dwr.


There is no Action mapped for action name dwr. - [unknown location]
    com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:177)
    com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory
。。。。。。


其实应该有一个配置,指明那些规则的url 不需要匹配action,可是目前没有发现

详见bug 讨论
https://issues.apache.org/struts/browse/WW-2969;jsessionid=694C1010E63EA0D2FA5434A1B5BEE14E?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel

作者也列出了几种解决的这种办法!
谁有更好的解决办法,请发出讨论之
   发表时间:2009-02-06   最后修改:2009-02-06
目前似乎没有什么很好的解决方案。其实也不算什么bug,只是一个plugin没有理由考虑其他plugin的情况,所以convention plugin仅仅支持无后缀的情况。

你可以自己写一个Filter,去覆盖plugin的Filter,并为你的dwr的请求设置一个.dwr这样的后缀,然后指定某些可配置的后缀,也走Struts2的Action,代码可以参考我的LightURL,我就是这么做的。
0 请登录后投票
   发表时间:2009-02-06  
写过filter 不过考虑到升级的愿因,放弃filter了
可能是我没说明白,不是dwr后缀的请求,而是某种路径的请求,比如 /somepa/xss/
类似,现实项目中,某些url 需要访问,但不需要映射到action,如果使用了插件,他就试图给所有无后缀的url 都匹配
0 请登录后投票
   发表时间:2009-02-06  
kjj 写道
写过filter 不过考虑到升级的愿因,放弃filter了
可能是我没说明白,不是dwr后缀的请求,而是某种路径的请求,比如 /somepa/xss/
类似,现实项目中,某些url 需要访问,但不需要映射到action,如果使用了插件,他就试图给所有无后缀的url 都匹配


后缀我只是举个例子,你可以配置嘛,配成类似antPath风格的路径设置,然后在你的Filter里面去过滤啊。

写Filter和升级有什么关系?
0 请登录后投票
   发表时间:2009-02-06  
請問convention plugins支不支持一個action多個方法如
xxx_list.do   ->返回"list"則找xxx/list.jsp
xxx_edit.do   ->返回"edit"則找xxx/edit.jsp


0 请登录后投票
   发表时间:2009-02-06  
downpour 写道
kjj 写道
写过filter 不过考虑到升级的愿因,放弃filter了
可能是我没说明白,不是dwr后缀的请求,而是某种路径的请求,比如 /somepa/xss/
类似,现实项目中,某些url 需要访问,但不需要映射到action,如果使用了插件,他就试图给所有无后缀的url 都匹配


后缀我只是举个例子,你可以配置嘛,配成类似antPath风格的路径设置,然后在你的Filter里面去过滤啊。

写Filter和升级有什么关系?

哦,看来理解错了,我以为要继承原来的filter 呢!
0 请登录后投票
   发表时间:2009-02-06  
yb31 写道
請問convention plugins支不支持一個action多個方法如
xxx_list.do   ->返回"list"則找xxx/list.jsp
xxx_edit.do   ->返回"edit"則找xxx/edit.jsp



可以通过action 注释配置这种情况,详情请看其文☭
0 请登录后投票
   发表时间:2009-02-06  
这个plugin没有用过,不过对于无效的url转到你自己指定的页面是可以实现的。
可以看看struts2的源代码,DefaultActionMapper的getMapping方法
    public ActionMapping getMapping(HttpServletRequest request,
            ConfigurationManager configManager) {
        ActionMapping mapping = new ActionMapping();
        String uri = getUri(request);

        int indexOfSemicolon = uri.indexOf(";");
        uri = (indexOfSemicolon > -1) ? uri.substring(0, indexOfSemicolon) : uri;

        uri = dropExtension(uri, mapping);
        if (uri == null) {
            return null;
        }

        parseNameAndNamespace(uri, mapping, configManager);

        handleSpecialParameters(request, mapping);

        if (mapping.getName() == null) {
            return null;
        }

        parseActionName(mapping);

        return mapping;
    }

它默认找不到就返回null,你可以重写ActionMapper的实现,当找不到时,自动返回一个默认的ActionMapping ,然后把默认的配置
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts" class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper" />

替换掉,这样到可以实现你的需求。
0 请登录后投票
   发表时间:2009-02-07   最后修改:2009-02-07
kjj 写道
yb31 写道
請問convention plugins支不支持一個action多個方法如
xxx_list.do   ->返回"list"則找xxx/list.jsp
xxx_edit.do   ->返回"edit"則找xxx/edit.jsp



可以通过action 注释配置这种情况,详情请看其文☭


每个方法都要注释配置那就比原来更麻烦了.是否能零配置默认支持的才好
0 请登录后投票
   发表时间:2009-02-07  
比原来麻烦不了多少,原来要写xml的,每个action 每个方法还不都得写!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics