Struts2 2.3.15升级2.5.30总结

Apache Struts2 2.3.15升级2.5.30踩坑总结
  • 升级内容

    • 程序Struts2 2.5.30升级适配
  • 版本要求

    • Apache Struts 框架的 2.5.x 系列最低要求以下规范版本:

      Tomcat7、Servlet API 2.4、JSP API 2.0 和 Java 7

  • 升级jar可参考官网,根据项目中用的jar包进行升级替换
    在这里插入图片描述

https://struts.apache.org/download.cgi#struts-ga

注意:xwork-core*.jar包直接删除,struts2-core-2.5.30.jar中已包含xwork-core的内容

  • 升级操作流程:

    修改web.xml、struts.xml,替换新版本依赖jar包,使用新版本依赖jar重新编译action包下相关struts代码,上传服务器进行替换

    • web.xml修改内容
    <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    • struts.xml修改内容

      • 修改头部内容,版本号改为2.5
      <!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
          "http://struts.apache.org/dtds/struts-2.5.dtd">
      
      • 增加访问权限配置regex:.*
      
      <!--global-allowed-methods标签必须放置在global-results后面,否则启动会报错 -->
      <package name="default" extends="json-default" strict-method-invocation="false">
      	<global-allowed-methods>regex:.*</global-allowed-methods>
      </package>
      
      
    • jar包替换

      根据项目中实际用到的jar进行版本升级,升级原则遵守,用到即升级,没用到不管,本项目Spring相关jar包没有升级,具体jar可参考Struts官网链接进行比对。

      https://struts.apache.org/download.cgi#struts-ga
      

    • struts代码

      Map parameterMap = mappingConfig.getParams();
      invocation.getInvocationContext().setParameters(new HashMap(parameterMap))
        
      修改为:
      HttpParameters parameters = HttpParameters.create(mappingConfig.getParams()).build();
      invocation.getInvocationContext().setParameters(parameters)
        
      根据替换struts2 2.5.30后API变动进行修改,action包下相关代码无需改动,但需要jar包替换升级后,重新编译action相关代码,服务器上进行替换,启动程序。
      

    如遇到如下问题:

    (1)convention.annotation.Result.name()(Found data of type calss java.lang.String[index])
    asm相关jar包从3.3.1升级至7.3.1后,可能是没有重新编译action相关代码导致。
    (2)jar包缺失类问题:
    建议jar升级进行追一替换,如使用rm -f asm*这种语法,jar包多加少加都可能会导致项目报错,细心逐一替换可避免很多问题。
    (3)升级参考文档:
    登录官网:https://struts.apache.org/
    查阅版本相关修改信息比网上乱七八糟博客更有用,官方文档更具有参考意义。
    

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2中,接收参数时被限制为最大只接收256长度的原因是因为Struts2默认使用的是ArrayList类型的TypeConverter进行参数类型转换,而该TypeConverter默认的最大值为256。 要解决这个问题,可以自定义一个TypeConverter,并替换掉Struts2默认的ArrayList类型的TypeConverter。具体步骤如下: 1. 自定义一个TypeConverter,继承自StrutsTypeConverter类,并重写convertFromString方法,如下所示: ```java import java.util.ArrayList; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class MyArrayListConverter extends DefaultTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { if (values == null || values.length == 0) { return null; } ArrayList<Object> list = new ArrayList<Object>(); for (String value : values) { list.add(value); } return list; } } ``` 2. 在struts.xml文件中注册该TypeConverter,并指定需要转换的参数类型,如下所示: ```xml <bean type="org.apache.struts2.util.StrutsTypeConverter" name="myArrayListConverter" class="com.example.MyArrayListConverter"/> <constant name="struts.conversion.array.maxSize" value="1000" /> <constant name="struts.conversion.array.allowNonList" value="true" /> <constant name="struts.conversion.collection.maxSize" value="1000" /> <constant name="struts.conversion.map.maxSize" value="1000" /> <constant name="struts.conversion.object.maxSize" value="1000" /> <constant name="struts.conversion.properties.maxSize" value="1000" /> <constant name="struts.conversion.date" value="false" /> <constant name="struts.conversion.number" value="false" /> <constant name="struts.conversion.boolean" value="false" /> <constant name="struts.conversion.class" value="false" /> <constant name="struts.conversion.fileUpload" value="false" /> <constant name="struts.conversion.patternMatcher" value="false" /> <constant name="struts.conversion.locale" value="false" /> <constant name="struts.conversion.classloader" value="false" /> <constant name="struts.conversion.enum" value="false" /> <constant name="struts.conversion.i18n" value="false" /> <constant name="struts.conversion.numberLocale" value="false" /> <constant name="struts.conversion.dateLocale" value="false" /> <constant name="struts.conversion.string" value="false" /> <constant name="struts.conversion.classArray" value="false" /> <constant name="struts.conversion.dateArray" value="false" /> <constant name="struts.conversion.numberArray" value="false" /> <constant name="struts.conversion.booleanArray" value="false" /> <constant name="struts.conversion.enumArray" value="false" /> <constant name="struts.conversion.i18nArray" value="false" /> <constant name="struts.conversion.patternMatcherArray" value="false" /> <constant name="struts.conversion.fileUploadArray" value="false" /> <constant name="struts.conversion.propertiesArray" value="false" /> <constant name="struts.conversion.collectionArray" value="false" /> ``` 在上述代码中,我们使用了常量struts.conversion.array.maxSize来指定了最大值为1000,这个值可以根据具体情况进行修改。同时,我们也可以通过其他常量来指定其他类型的最大值。 3. 在action中将需要转换的参数指定为该TypeConverter,如下所示: ```java public class MyAction extends ActionSupport { private ArrayList<Object> list; public ArrayList<Object> getList() { return list; } public void setList(ArrayList<Object> list) { this.list = list; } @Override public String execute() throws Exception { // do something return SUCCESS; } @Override public void validate() { if (list != null && list.size() > 1000) { addFieldError("list", "列表长度不能超过1000"); } } @Override public void prepare() throws Exception { // 注册TypeConverter ConvertUtils.register(new MyArrayListConverter(), ArrayList.class); } } ``` 在上述代码中,我们将需要转换的参数list指定为自定义的TypeConverter,在prepare方法中注册TypeConverter。同时,在validate方法中可以对list的大小进行验证,以避免超过指定的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值