2013-05-22 41 views
10

Tôi muốn deserialize (ràng buộc) JSON thành đối tượng java. Làm thế nào để làm điều đó trong Struts2?Cách liên kết JSON với đối tượng Java trong Struts2 bằng cách sử dụng struts2-json-plugin

Tôi đang cố gắng làm điều đó với plugin struts2-json như bạn có thể thấy trong mã bên dưới, nhưng gửi JSON từ giao diện người dùng không ràng buộc đối tượng java của tôi. Bạn có thể giúp tôi, làm cách nào để làm cho mã này hoạt động chính xác?

Vui lòng xem lớp Hành động của tôi, tôi không chắc liệu mình có đang xử lý JSON chính xác trong Hành động này hay có thể tôi đã bỏ sót điều gì đó?

JSON mà tôi đang cố gắng để ràng buộc:

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

Gửi JSON bởi 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'); 
    } 
    } 
}); 

Nhận JSON trong struts2:

tôi có thể đạt được phương thức execute() trong deb ug, nhưng thật không may, trường data luôn là rỗng. Tôi nên làm gì để làm cho trường này chứa đầy dữ liệu từ JSON? JSON có đúng định dạng để liên kết với List<Report> data không?

@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; 
    } 
} 

Báo cáo lớp:

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

    //getters and setters 
} 

struts.xml:

Như bạn thấy ở đây tôi đã thêm <interceptor-ref name="json"> với <param name="enableSMD">true</param>. Toàn bộ cấu hình bên dưới:

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

Tôi đang làm gì sai? Bạn có thể gợi ý cho tôi một số ví dụ/hướng dẫn tốt về cách thực hiện deserialization từ JSON sang Java trong Struts2 không, vì tôi không thể tìm thấy ngay cả một ví dụ đầy đủ chính xác với JSON deserialization trong Struts2, ví dụ đặc biệt của mã Action sẽ nhận JSON và liên kết nó với Java .

Tôi mới trong Struts, vì vậy đó là lý do tại sao tôi có vấn đề để hiểu một số vấn đề và lưu lượng, ví dụ như cách nhận và xử lý JSON trong Hành động. Có những ví dụ cho serialization với struts2-json-plugin, nhưng với chủ đề này tôi đã không gặp rắc rối. Xin hãy giúp tôi ...

+0

bạn đã cố gắng deserialize tải trọng bằng cách sử dụng http://code.google.com/p/google-gson/? – Chris

+0

nope, tôi đang sử dụng nó để serialize và nó ok, vấn đề là chỉ trong deserialize. Tôi nghĩ rằng các plugin chính thức để struts2 từ Apache nên được lựa chọn tuyệt vời ... nhưng đối với tôi là thiếu một số ví dụ .. – Roman

+1

có thể trùng lặp của [Lấy dữ liệu từ handsontable để hành động Struts2 thông qua JSON không làm việc] (http: // stackoverflow. com/questions/16675821/retrieve-data-from-handsontable-to-struts2-action-via-json-not-working) –

Trả lời

5

Tôi đã tìm ra. Đã thiếu:

contentType: 'application/json', 

trong yêu cầu Ajax của tôi.

+0

Tôi đã thử nhưng Tôi nhận được lỗi dưới đây – Rajesh

Các vấn đề liên quan