我想将 JSON 反序列化(绑定)到 java 对象。如何在 Struts2 中做到这一点?
我正在尝试使用 struts2-json-plugin 来执行此操作,如您在下面的代码中所见,但从前端发送的 JSON 未绑定到我的 java 对象。你能帮我吗,请如何使这段代码正常工作?
请看一下我的 Action 类,我不确定我在这个 Action 中是否正确处理了 JSON,或者我错过了什么?
我试图绑定的 JSON:
{"data":[
{"active":true,"color":"orange","date":"2008-01-01","id":1,"name":"Chris"},
{"active":false,"color":"blue","date":"2013-03-03","id":2,"name":"Kate"},
{"active":true,"color":"black","date":"2013-05-03","id":3,"name":"Blade"},
{"active":false,"color":"yellow","date":"2013-01-01","id":4,"name":"Zack"}]
}
通过 Ajax 发送 JSON:
$.ajax({
url: "../json/saveJSONDataAction.action",
data: {"data": handsontable.getData()}, //returns all cells' data
dataType: 'json',
type: 'POST',
success: function (res) {
if (res.result === 'ok') {
$console.text('Data saved');
}
}
});
在 Struts2 中接收 JSON:
我可以在调试中达到 execute() 方法,但不幸的是,该data
字段始终为空。我应该怎么做才能使这个字段充满来自 JSON 的数据?JSON 的绑定格式是否正确List<Report> data
?
@ParentPackage("json-default")
@Action(value="saveJSONDataAction")
@Result(type="json")
public class JSONSaveAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<Report> data;
public JSONSaveAction(){
}
public String execute() {
try {
System.out.println(data);
} catch (Exception e) {
e.printStackTrace();
}
return NONE;
}
public List<Report> getData() {
return data;
}
public void setData(List<Report> data) {
this.data = data;
}
}
报告类:
public class Report {
private int id;
private String name;
private boolean active;
private String date;
private String color;
//getters and setters
}
struts.xml:
正如你在这里看到的,我添加<interceptor-ref name="json">
了<param name="enableSMD">true</param>
. 整个配置如下:
<struts>
<constant name="struts.action.extension" value="action,pdf" />
<constant name="struts.i18n.reload" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.custom.i18n.resources" value="i18n/ap,application" />
<constant name="struts.date.format" value="yyyy-MM-dd" />
<constant name="struts.serve.static" value="true" />
<constant name="struts.serve.static.browserCache" value="false" />
<package name="default" namespace="/ftl" extends="json-default">
<result-types>
<result-type name="rethrowException" class="com.myhome.commons.util.ExceptionRethrowResult" />
<result-type name="poi-excel" class="com.myhome.commons.util.PoiExcelResult"/>
</result-types>
<interceptors>
<interceptor name="businessException" class="com.myhome.commons.exception.BusinessExceptionInterceptor"></interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="i18n" />
<interceptor-ref name="chain" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload">
<param name="maximumSize">10485760</param>
</interceptor-ref>
<interceptor-ref name="checkbox" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
<interceptor-ref name="prepare" />
<interceptor-ref name="conversionError" />
<interceptor-ref name="businessException" />
<interceptor-ref name="validation">
<param name="includeMethods">save,search</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="includeMethods">save,search</param>
</interceptor-ref>
<interceptor-ref name="tokenSession">
<param name="includeMethods">save</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
<global-results>
<result name="exception" type="chain">
<param name="actionName">exception</param>
<param name="namespace">/</param>
</result>
<result name="rethrowException">/applicationAccessDeniedPage.jsp</result>
<result name="applicationAccessDenied">/applicationAccessDeniedPage.jsp</result>
<result name="unavailableResource">/unavailableResource.jsp</result>
<result name="pessimisticLock">/pessimisticLock.jsp</result>
<result name="goto-crud" type="redirect">/crud/index.action</result>
<result name="goto-dict" type="redirect">/dictionaries/index.action</result>
<result name="reportXls" type="poi-excel">
<param name="contentDisposition">attachment; filename="${resultFileName}"</param>
<param name="excelWorkbook">workbook</param>
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="com.myhome.ap.service.exception.AuthorizationFailedException" result="rethrowException"/>
<exception-mapping exception="com.myhome.ap.service.exception.ApplicationAccessDeniedException" result="applicationAccessDenied"/>
<exception-mapping exception="org.hibernate.ObjectNotFoundException" result="unavailableResource" />
<exception-mapping exception="com.myhome.ap.service.exception.model.EntityHasBeenDeletedException" result="unavailableResource" />
<exception-mapping exception="com.myhome.ap.service.exception.PessimisticLockingException" result="pessimisticLock" />
<exception-mapping exception="java.lang.Exception" result="exception"/>
</global-exception-mappings>
<action name="version" class="com.myhome.ap.web.action.VersionAction" />
</package>
</struts>
我究竟做错了什么?你能建议我一些很好的例子/教程如何在 Struts2 中从 JSON 反序列化到 Java,因为我在 Struts2 中找不到一个正确的完整的 JSON 反序列化示例,特别是接收 JSON 并将其绑定到 Java 的 Action 代码示例.
我完全是 Struts 的新手,所以这就是为什么我在理解一些问题和流程方面遇到问题,例如如何在 Action 中接收和处理 JSON。有使用 struts2-json-plugin 进行序列化的示例,但是对于这个主题我没有任何问题。请帮我...