1. 程式人生 > >struts2 升級2.3.35 action中方法無法正常對映

struts2 升級2.3.35 action中方法無法正常對映

內部專案,使用了maven,struts2則是使用了它的零配置特性(使用註解或預設約定)

1、maven中定義版本常量
<struts2.version>2.3.35</struts2.version>

2、struts2關鍵依賴相關jar內容(好像還有commons-io,commons-fileupload,commens-lang3,comments-logging,但本次升級沒有管這些,以後遇到問題再說)
<dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>${struts2.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun</groupId>
                    <artifactId>tools</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>${struts2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>${struts2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <dependency>
      <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>3.0.21</version>
            <exclusions>
                <!-- use javassist.javassist instead -->
                <exclusion>
                    <groupId>jboss</groupId>
                    <artifactId>javassist</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.11.0.GA</version>
        </dependency>
        

升級完成後啟動一切正常,但訪問登入頁login.action是ok的,其它則無法正常訪問,很奇怪,感覺貌似跳到了方法,但方法內打斷點又進不去;

狀態貌似只能訪問到action中的預設execute方法,其它方法則對映異常(斷點進不去,前臺頁面貌似返回了對應的頁面,但只有html部分,jsp內容完全沒有,sitemesh也無法裝飾);
多方查詢終於找到問題,本身基於版本較低2.3.15.1 升級到2.3.35,升級後struts.xml 中必須增加<constant name="struts.enable.DynamicMethodInvocation" value="true" />配置,否則動態方法就無法對映,早期低版本應該是沒有必須這個配置的(因為升級前使用一切正常),但嚴格意義上來說也並不是2.3.35才這樣,應該是早就有這樣的要求了,只是專案一直沒有升級,所以到現在才暴露出來。
這麼久不升級的人應該也不多,這裡記錄一下供後續參考吧.

總結:
   檢查struts.xml中增加配置<constant name="struts.enable.DynamicMethodInvocation" value="true" />

   原因:2.3.15前沒問題,但在新版本中需要配置動態方法為true,否則訪問類似login!test.action無法對映的test方法
   另外網上有資料顯示,零配置需要增加<constant name="struts.convention.action.mapallmatches" value="true"/>,但這裡驗證發現不加此配置也可以正常對映