Jak powiązać JSON z obiektem Java w Struts2 za pomocą wtyczki struts2-json

Chcę deserializować (powiązać) JSON z obiektem java. Jak to zrobić w Struts2?

Próbuję to zrobić za pomocą wtyczki struts2-json-jak widać w poniższym kodzie, ale wysłanie JSON z frontendu nie wiąże się z moim obiektem java. Czy możesz mi pomóc, jak sprawić, by ten kod działał poprawnie?

Proszę spojrzeć na moją klasę akcji, nie jestem pewien, czy poprawnie obsługuję JSON w tej akcji, czy może coś przeoczyłem?

JSON, który próbuję powiązać:

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

Wysyłanie JSON przez 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');
    }
  }
});

Odbieranie JSON w Struts2:

Mogę osiągnąć metodę execute () w debugowaniu, ale niestetydata pole jest zawsze puste. Co powinienem zrobić, aby wypełnić to pole danymi z JSON? Czy JSON ma poprawny format do powiązaniaList<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;
    }
}

Klasa raportu:

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

    //getters and setters
}

struts.xml:

Jak widać tutaj dodałem<interceptor-ref name="json"> z<param name="enableSMD">true</param>. Cała konfiguracja poniżej:

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

Co ja robię źle? Czy możesz zaproponować mi kilka dobrych przykładów / samouczka, jak zrobić deserializację z JSON do Java w Struts2, ponieważ nie mogę znaleźć nawet jednego poprawnego pełnego przykładu z deserializacją JSON w Struts2, specjalnie przykład kodu akcji, który otrzyma JSON i powiąza go z Javą .

W ogóle jestem nowy w Struts, dlatego mam problemy ze zrozumieniem niektórych problemów i przepływów, na przykład, jak odbierać i obsługiwać JSON w akcji. Istnieją przykłady serializacji za pomocą wtyczki struts2-json, ale w tym temacie nie miałem żadnych problemów. Proszę pomóż mi...

questionAnswers(1)

yourAnswerToTheQuestion