Comment lier JSON à l'objet Java dans Struts2 en utilisant struts2-json-plugin

Je veux deserialize (bind) JSON pour objet java. Comment faire dans le Struts2?

Je suis en train de le faire avec struts2-json-plugin comme vous pouvez le voir dans le code ci-dessous, mais il a envoyé JSON de frontend n'est pas obligatoire à mon objet java. Pourriez-vous m'aider, s'il vous plaît comment faire de ce code fonctionne correctement?

Veuillez jeter un oeil à ma classe de l'Action, je ne sais pas si je suis la manipulation JSON correctement dans cette Action, ou peut-être que j'ai raté quelque chose?

JSON que j'essaie de lier:

{"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"}]
}

Envoi JSON par Ajax:

$.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');
    }
  }
});

La réception de JSON dans Struts2:

Je peux atteindre méthode execute() debug, mais malheureusement, la data champ est toujours null. Que dois-je faire pour rendre ce champ rempli avec les données JSON? Est le JSON dans le format correct pour se lier à 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;
    }
}

Rapport de classe:

public class Report {
    private int id;
    private String name;
    private boolean active;
    private String date;
    private String color;

    //getters and setters
}

struts.xml:

Comme vous pouvez le voir ici, j'ai ajouté <interceptor-ref name="json"> avec <param name="enableSMD">true</param>. Toute la config ci-dessous:

<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>

Ce que je fais mal? Pouvez-vous me suggérer quelques bons exemples/tutoriel comment faire de la désérialisation de JSON pour Java Struts2, parce que je ne trouve pas même une seule bonne exemple complet avec JSON désérialisation dans Struts2, spécialement exemple de code d'une Action qui va recevoir le JSON et le lier à Java.

Je suis nouveau dans Struts à tous, c'est pourquoi j'ai des problèmes pour comprendre certains enjeux et de la circulation, par exemple la façon de recevoir et de traiter JSON dans l'Action. Il y a des exemples pour la sérialisation avec struts2-json-plugin, mais avec ce sujet, je n'avais aucun problème. Merci de m'aider...

source d'informationauteur Roman