Java 属性setData[JSON+;Struts2 plugin]的类型不兼容
我需要用我当前的JAVA web应用程序配置JSON插件()。我所做的: 1) 将插件的所有依赖项添加到Java 属性setData[JSON+;Struts2 plugin]的类型不兼容,java,json,maven,struts2,struts2-json-plugin,Java,Json,Maven,Struts2,Struts2 Json Plugin,我需要用我当前的JAVA web应用程序配置JSON插件()。我所做的: 1) 将插件的所有依赖项添加到pom.xml文件中 <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.24.1</version> </dependen
pom.xml
文件中
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.3.24.1</version>
</dependency>
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>
6) 创建了一个JSON
对象,并通过ajax
将其传递给服务器。我可以通过GoogleChrome控制台看到,它发送数据并解析JSON对象,所有数据都在那里。但是,它确实在我的Eclipse和Chrome控制台中引发了一个异常:
处理请求期间发生异常:属性setData的类型不兼容(commonLogger.java[qtp1144623021-22])
org.apache.struts2.json.JSONException:属性setData的不兼容类型
你能给我指一个正确的方向吗?这几乎是我工作的第二天了,但似乎还没有开始工作
编辑1:
数据被发送到java端,我可以通过Chrome控制台看到它
{"data":{"recordId":"123","registrationDate":"20-07-2016","hisId":"","herId":"","lastNameHe":"Asd","firstNameHe":"Asd","middleNameHe":"Asd","workPlaceHe":"","educationHe"}}
这是被JSON.stringify
-ed后的对象。
正如您所看到的,它有根data
变量,然后所有其余的数据都在它下面。根据我的逻辑,ti必须在java类中找到数据的setter
,然后调用该类的setter/getter。
另外,我重命名了类的名称等,所以不用担心命名约定)我的产品代码中有正确的东西
编辑2:
谢谢你指出我的错误@AleksandrM。现在它抛出了一个非常奇怪的错误:
无法解释的日期:“2016年7月20日”(commonlogger.java[qtp212900572-17])
java.text.ParseException:不可解析日期:“20-07-2016”
此部分的json
变量是registrationDate
,它在JAVA中的实现:
private Date registrationDate;
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
据我所知,它试图将
字符串
设置为日期
,但无法执行。为什么json插件不能转换它?我应该在选项/设置中写些什么吗?您希望Java代码中包含列表数据,但JSON对象不包含任何数组。将Java代码更改为婚姻数据,或者在JSON中发布对象数组
除了json
,您可能还需要为操作定义其他拦截器。
创建自定义拦截器堆栈并在操作配置中引用它
<interceptor-stack name="json-stack">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
要将日期字符串转换为date
对象,请使用默认格式(即yyyy-MM-dd'HH:MM:ss
)或创建自定义格式。
或者在setter上使用@JSON(format=“dd.MM.yyyy”)
请参阅。如果使用defaultStack plus json拦截器而不是仅使用json拦截器,是否有效?婚姻是否有默认的无参数构造函数(或无构造函数)?注意:一个以一个大写字母开头的Java类并不好,你需要使用defaultStack
+json
拦截器。显示您提交的数据。@AndreaLigios,我认为这不是defaultStack的问题,也不是struts中拦截器的位置问题。不,我的Marraige类没有任何构造函数。Marraige类与hibernate连接,用于创建db表等,该类的目的只是作为描述它的纯模型。java代码中有列表,但json中没有。@AleksandrM,好的。让我更新代码,看看我将获得什么完整性,默认格式(仅限日期RFC3339),而他正在使用2.3.24.1,因此被迫使用converter@AndreaLigios关于json和类型转换的部分似乎不正确。“我要更改它。@AndreaLigios,我读过关于默认格式日期的文章,我知道这个补丁,但我无法升级,因为我使用的是一个大框架,我正在为它开发一个单独的模块。。我不想处理另一个框架问题,所以
private Date registrationDate;
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
<interceptor-stack name="json-stack">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>