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

标签 java struts2 struts2-json-plugin

我想将 JSON 反序列化(绑定(bind))到 java 对象。在Struts2中如何实现?

我正在尝试使用 struts2-json-plugin 来完成它,正如您在下面的代码中看到的那样,但是从前端发送的 JSON 没有绑定(bind)到我的 java 对象。你能帮我吗,请问如何使这段代码正常工作?

请看一下我的 Action 类,我不确定我是否在这个 Action 中正确处理了 JSON,或者我错过了什么?

我尝试绑定(bind)的 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 的格式是否正确以绑定(bind)到 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 并将其绑定(bind)到 Java 的 Action 代码的例子.

我完全是 Struts 的新手,所以这就是为什么我在理解一些问题和流程时遇到问题,例如如何在 Action 中接收和处理 JSON。有使用 struts2-json-plugin 进行序列化的示例,但是对于这个主题我没有遇到任何问题。请帮助我...

最佳答案

我想通了。缺少:

contentType: 'application/json',

在我的 Ajax 请求中。

关于java - 如何使用 struts2-json-plugin 将 JSON 绑定(bind)到 Struts2 中的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698082/

相关文章:

java - 字符串文字和 J2EE 不良实践 : Non-Serializable Object Stored in Session

java - 如何区分 get 和 post call..?

java - Struts2 BigDecimal 转换器未转换为字符串

java - 在操作调用中生成 Struts 2 JSON 输出

java - 我们如何将 Struts2 操作类传递给 angularjs $http get

java - 如何在 Android Studio 运行时更改小部件的样式

java - 如何在此处修复 java.lang.IndexOutOfBoundsException 错误?

java - 如何在JUnit测试中使用Mockito?

java - Struts 1.x 与 Struts 2.x

java - 支柱 2 : There is no Action mapped for namespace [/]