属性 setData [JSON+Struts2 插件的不兼容类型]

Incompatible types for property setData [JSON+Struts2 plugin]

我需要使用我当前的 JAVA Web 应用程序配置 JSON 插件 (https://struts.apache.org/docs/json-plugin.html)。我做了什么:

1) 添加到 pom.xml 文件中插件的所有依赖项。

<dependency>
   <groupId>org.apache.struts</groupId>
   <artifactId>struts2-json-plugin</artifactId>
   <version>2.3.24.1</version>
</dependency>

2) 用 json-default

扩展了 struts.xml 中的包
<package name="my-test-package" extends="xxx, json-default"
    namespace="/my-test-package">

3) 添加到我的操作中 json

的拦截器和结果类型
<action name="myMainAction"
    class="org.com.action.myMainAction">
        <interceptor-ref name="json">
           <param name="enableSMD">true</param>
        </interceptor-ref>
        <result type="json">                    
        </result>           
    <param name="requiredAuthorities">F_ADD</param>
</action>

4) 创建了一个模型 class Marriage 其中只有 setters/getters。

5) 创建了操作 class,命名为 myMainAction,代码如下

private List <Marriage> data;

public List<Marriage> getData() {
    return data;
}
public void setData(List<Marriage> data) {
     System.out.println("Inside the setter ");
    this.data = data;
}


@Override
public String execute() throws Exception {

    System.out.println(data.get(0).getLastNameHe());

    return SUCCESS;
}

6) 创建了一个 JSON 对象并通过 ajax 将其传递给服务器。我可以通过 Google Chrome 控制台看到它发送数据并解析 JSON 对象,所有数据都在那里。但是,它确实在我的 Eclipse 和 Chrome 控制台中抛出异常:

Exception occurred during processing request: Incompatible types for property setData (CommonsLogger.java [qtp1144623021-22]) org.apache.struts2.json.JSONException: Incompatible types for property setData

你能给我指出一些正确的方向吗,这几乎是我工作的第二天,但它似乎没有开始工作。

编辑1: 发送到 java 端的数据,我可以通过 Chrome 控制台看到它。

{"data":{"recordId":"123","registrationDate":"20-07-2016","hisId":"","herId":"","lastNameHe":"Asd","firstNameHe":"Asd","middleNameHe":"Asd","workPlaceHe":"","educationHe"}}

这是JSON.stringify编辑后的对象。 如您所见,它有根 data 变量,然后所有其余数据都在它下面。根据我的逻辑,ti 必须在我的 java class 中找到数据的 setter,然后调用那个 class 的 setters/getters。 P.S 我重命名了 classes 等的名称,所以不用担心命名约定)我的生产代码确实有正确的东西。

编辑 2:

感谢@AleksandrM 指出我的错误。现在它抛出一个非常奇怪的错误:

Unparseable date: "20-07-2016" (CommonsLogger.java [qtp212900572-17]) java.text.ParseException: Unparseable date: "20-07-2016"

这部分的json变量是registrationDate及其在JAVA中的实现:

 private Date registrationDate;
    public Date getRegistrationDate() {
    return registrationDate;
}

public void setRegistrationDate(Date registrationDate) {
    this.registrationDate = registrationDate;

据我所知,它试图将 string 设置为 date,但它无法做到。为什么 json-plugin 不能转换它?我应该在 options/settings 中写点什么吗?

您期望 Java 代码中的 List<Marriage> data 但您的 JSON 对象不包含任何数组。将 Java 代码更改为 Marriage data 或 post JSON 中的对象数组。

除了 json 之外,您可能还想为该操作定义其他拦截器。 创建自定义拦截器堆栈并在您的操作配置中引用它。

<interceptor-stack name="json-stack">
    <interceptor-ref name="json" />
    <interceptor-ref name="defaultStack" />
</interceptor-stack>

要将日期字符串转换为 Date 对象,请使用默认格式(即 yyyy-MM-dd'T'HH:mm:ss或创建自定义 Struts type converter。 或者在 setter 上使用 @JSON(format = "dd.MM.yyyy")