【问题标题】:How to bind JSON to Java object in Struts2 using struts2-json-plugin如何使用 struts2-json-plugin 将 JSON 绑定到 Struts2 中的 Java 对象
【发布时间】:2013-05-22 17:28:05
【问题描述】:

我想将 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:

正如您在此处看到的,我添加了&lt;interceptor-ref name="json"&gt;&lt;param name="enableSMD"&gt;true&lt;/param&gt;。整个配置如下:

<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 进行序列化的示例,但是对于这个主题,我没有任何问题。请帮帮我...

【问题讨论】:

  • 您是否尝试使用 code.google.com/p/google-gson 反序列化有效负载?
  • 不,我用它来序列化,没关系,问题只在反序列化期间。我认为从 Apache 到 struts2 的官方插件应该是不错的选择......但对我来说缺少一些例子......
  • 是的,它很相似,但是这个问题被简化并集中在问题上。
  • 你如何处理验证?例如如果一个 json 字段是 int 但被传递了 string ?请看我的问题here

标签: java struts2 struts2-json-plugin


【解决方案1】:

我想通了。缺少:

contentType: 'application/json',

在我的 Ajax 请求中。

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多