2013-05-22 11 views
10

Chcę deserializować (powiązać) JSON z obiektem Javy. Jak to zrobić w Struts2?Jak powiązać JSON z obiektem Java w Struts2 przy użyciu polecenia struts2-json-plugin

Próbuję zrobić to z wtyczką struts2-json, jak widać w poniższym kodzie, ale wysłany JSON z frontendu nie jest wiążący dla mojego obiektu java. Czy możesz mi pomóc, proszę, jak sprawić, by ten kod działał poprawnie?

Proszę spojrzeć na moją klasę Akcji, nie jestem pewien, czy poprawnie operuję JSONem 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ę dotrzeć Metoda execute() w deb ug, ale niestety, pole data jest zawsze puste. Co powinienem zrobić, aby pole to wypełniło się danymi z JSON? Czy JSON ma poprawny format, aby połączyć się z 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; 
    } 
} 

Zgłoś klasa:

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 robię źle? Czy możesz zaproponować mi kilka dobrych przykładów/tutoriala jak dokonać deserializacji z JSON na Javę w Struts2, ponieważ nie mogę znaleźć nawet jednego poprawnego pełnego przykładu z deserializacją JSON w Struts2, szczególnie przykładem kodu Action, który odbierze JSON i powiąza go z Javą .

Jestem w ogóle nowy w Struts, dlatego mam problemy, aby zrozumieć pewne problemy i przepływ, na przykład, jak odbierać i obsługiwać JSON w akcji. Istnieją przykłady serializacji z wtyczką struts2-json, ale z tym tematem nie miałem problemu. Proszę mi pomóc ...

+0

próbowałeś spersjonizować ładunek za pomocą http://code.google.com/p/google-gson/? – Chris

+0

nie, używam go do serializowania i jest OK, problem występuje tylko podczas deserializacji. Pomyślałem, że oficjalna wtyczka do struts2 z Apache powinna być świetnym wyborem ... ale dla mnie brakuje niektórych przykładów .. – Roman

+1

możliwy duplikat [Pobierz dane z handsontable do Struts2 Action przez JSON nie działa] (http: // stackoverflow. com/questions/16675821/retrieve-data-from-handsontable-to-struts2-action-via-json-not-working) –

Odpowiedz

5

Wymyśliłem to. Brakowało:

contentType: 'application/json', 

w mojej prośbie o Ajax.

+0

Próbowałem, ale Otrzymuję poniższy błąd – Rajesh

Powiązane problemy