属性 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")
。
见。
我需要使用我当前的 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
<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")
。
见