2013-05-22 3 views
10

Я хочу десериализовать (привязать) JSON к объекту java. Как это сделать в Struts2?Как связать объект JSON с Java в Struts2 с помощью struts2-json-plugin

Я пытаюсь сделать это с помощью struts2-json-plugin, как вы можете видеть в коде ниже, но отправленный JSON из frontend не привязан к моему java-объекту. Не могли бы вы мне помочь, пожалуйста, как правильно работать с этим кодом?

Пожалуйста, взгляните на мой класс 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"}] 
} 

Отправка JSON с помощью 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'); 
    } 
    } 
}); 

Получение JSON в Struts2:

я могу достичь execute() в deb ug, но, к сожалению, поле 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; 
    } 
} 

Report класс:

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> 

Что я делаю неправильно? Можете ли вы предложить мне несколько хороших примеров/учебников, как сделать десериализацию с JSON на Java в Struts2, потому что я не могу найти даже один правильный полный пример с десериализацией JSON в Struts2, особенно пример кода действия, который получит JSON и привяжет его к Java ,

Я новичок в Struts, поэтому у меня возникли проблемы, чтобы понять некоторые проблемы и поток, например, как получать и обрабатывать JSON в действии. Есть примеры для сериализации с помощью struts2-json-plugin, но с этим вопросом у меня не было проблем. Пожалуйста, помогите мне ...

+0

Вы пытались десериализовать полезную нагрузку, используя http://code.google.com/p/google-gson/? – Chris

+0

Нет, я использую его для сериализации, и все в порядке, проблема только во время десериализации. Я думал, что официальный плагин для struts2 из Apache должен быть отличным выбором ... но для меня отсутствуют некоторые примеры. – Roman

+1

Возможный дубликат [Извлечение данных с помощью handsontable в Struts2 Action через JSON не работает] (http: // stackoverflow. com/questions/16675821/retrieve-data-from-handsontable-to-struts2-action-via-json-not-working) –

ответ

5

Я понял. Не было получено:

contentType: 'application/json', 

в моем запросе Ajax.

+0

Я пробовал, но Я получаю следующую ошибку – Rajesh