将 Struts 从 2.3.7 升级到 2.3.33 后 JSONWriter.setDateFormatter 的 NoSuchMethodError

Posted

技术标签:

【中文标题】将 Struts 从 2.3.7 升级到 2.3.33 后 JSONWriter.setDateFormatter 的 NoSuchMethodError【英文标题】:NoSuchMethodError for JSONWriter.setDateFormatter after upgrade Struts from 2.3.7 to 2.3.33 【发布时间】:2018-06-12 23:01:00 【问题描述】:

我将 Struts 从 2.3.7 升级到 2.3.33(使用 Maven)。虽然使用 2.3.7 版,我的 Web 应用程序可以正常工作,但在升级到 2.3.33 后,我在尝试访问包含对服务器的 Ajax 调用的网页时收到以下异常。

java.lang.NoSuchMethodError: org.apache.struts2.json.JSONWriter.setDateFormatter(Ljava/lang/String;)V 在 org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:106)[struts2-json-plugin-2.3.33.jar:] 在 org.apache.struts2.json.JSONResult.createJSONString(JSONResult.java:203)[struts2-json-plugin-2.3.33.jar:] 在 org.apache.struts2.json.JSONResult.execute(JSONResult.java:177)[struts2-json-plugin-2.3.33.jar:] 在 com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:372)[xwork-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:276)[xwork-core-2.3.33.jar:2.3.33] 在 org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)[struts2-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)[xwork-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:168)[xwork-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)[xwork-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)[xwork-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)[xwork-core-2.3.33.jar:2.3.33] 在 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)[xwork-core-2.3.33.jar:2.3.33]

当我的 Java Action 将 json 响应发送回客户端时发生错误。

下面是我使用的 Ajax 调用:

  $.ajax(
        url :  "list-sample-json",
           //   data : options.data,
           //   dataType : "json",
    
        type: "POST",
        data: JSON.stringify( sortParameters : sortParametersList, pageSize:options.data.pageSize, skip:options.data.skip ),
        contentType : "application/json; charset=utf-8",
        dataType : "json",
        success : function (result) 
        options.success(result);
        ,
        error : function (response, status, error) 
        openErrorDialog(response, status, error);
                                    
    );

访问我的操作没有任何问题并返回SUCCESS。如上所述,问题似乎是在 Struts 为客户端生成 JSON 响应时出现的。下面也是我的 Java 类,其结果类型为 json

@Result(name = "success", type = "json", params =  "ignoreHierarchy", "false",
        "includeProperties", "textsampleList.*, count" )
@Injectable
public class ListSampleJsonAction 

    @Override
    public String execute() 
        
        List<SampleDTO> sampleList = new ArrayList<>();
        sampleList.add(new SampleDTO("sample")) ;
        return SUCCESS;
    
          

我想提一下,在 2.3.16.3 之前,上述实现一直在工作,并且我从服务器收到了响应(带有请求的数据)。

我使用 maven 3.0.4 和 Java 1.7_079。任何人都可以提出可能出了什么问题吗?

【问题讨论】:

【参考方案1】:

错误 java.lang.NoSuchMethodError: org.apache.struts2.json.JSONWriter.setDateFormatter(Ljava/lang/String;)V

该方法可在javadoc获得。

来自Github。

所以你有@HarKrishan 在评论中提到的一个 jar 冲突版本。

但如果不是,那么您可能需要在类路径中拥有正确版本的 asm 库。

【讨论】:

存在jar冲突 不冲突什么? NoSuchMethodError 的主要原因是您可能针对与运行时使用的版本不同的版本编译了一个类。所以有jar冲突。 @HarKrishan 我没有编译任何东西(插件)是从 maven 存储库下载的。如果你从 github 编译,那么你不会得到NoSuchMethodError,因为它明确表明它有一个方法引用。 @RomanC 我检查了 asm 库版本,我使用的是 xwork-core 2.3.33 中包含的 3.3。我不知道这是否是正确的版本。至于 jar 冲突,我所有的 struts 库都是相同的版本。我仍然有同样的问题。

以上是关于将 Struts 从 2.3.7 升级到 2.3.33 后 JSONWriter.setDateFormatter 的 NoSuchMethodError的主要内容,如果未能解决你的问题,请参考以下文章

Struts从2.1升级到2.3版本过程

Struts2版本升级到struts2 2.3.15.1操作说明

将 Spring Boot 升级到 2.4.1

struts2中配置文件的调用顺序

struts升级2.3.12到2.5.13

Struts2升级 2.3.xx版本升级至2.3.37版本