如何使用struts2-json-plugin将JSON绑定到Struts2中的Java对象

时间:2013-05-22 17:28:05

标签: java struts2 struts2-json-plugin

我想将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字段始终为null。如何使此字段填充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进行序列化的例子,但是有了这个主题,我没有遇到任何麻烦。请帮帮我......

1 个答案:

答案 0 :(得分:5)

我明白了。失踪了:

contentType: 'application/json',

在我的Ajax请求中。