2015-04-13 4 views
0

Я хочу отправить AJAX запроса после моего действия распорок с помощью JQuery, как это:Почему я не могу получить json от действия struts 2?

$.ajax({ 
     type: "POST", 
     url: "ds/query",  
     data :JSON.stringify(data), 
     dataType:"json", 
     contentType: "application/json; charset=utf-8", 
     success : function(d, t, x){ 
      console.log(x); 
     } 
    }); 

моего действия configuaration:

<package name="ds" namespace="/ds" extends="json-default"> 
     <action name="query" class="gov.cbrc.gzbanking.action.DataServiceAction" method="query"> 
      <interceptor-ref name="json"> 
       <param name="enableSMD">true</param> 
      </interceptor-ref> 
      <result type="json"> 
       <param name="noCache">true</param> 
       <param name="excludeNullProperties">true</param> 
       <param name="root">qRes</param> 
      </result> 
     </action> 
    </package> 

моего класс действия:

public class DataServiceAction { 

    private QueryRequest qReq; 

    private QueryResponse qRes; 

    public QueryRequest getQr() { 
     return qReq; 
    } 

    public void setQr(QueryRequest qReq) { 
     this.qReq = qReq; 
    } 

    public QueryResponse getqRes() { 
     return qRes; 
    } 

    public void setqRes(QueryResponse qRes) { 
     this.qRes = qRes; 
    } 

    public String query() throws Exception{ 
     App.getLogger().debug(qReq.toString()); 
     String dsClz = SysCodes.getCodeItem("data_service", qReq.getDs()).getConfig1(); 
     Class<?> dsCls = Class.forName(dsClz); 
     if(!DataService.class.isAssignableFrom(dsCls)){ 
      throw new Exception("specified class does't implement DataService interface."); 
     }else{ 
      DataService ds = (DataService) dsCls.newInstance(); 
      System.out.println(JsonUtil.toJson(ds.query(qReq))); 
      qRes = ds.query(qReq); 
     } 
     return ActionSupport.SUCCESS; 
    } 

} 

QueryRequest и QueryResponse являются только java beans, когда я выполняю свой код, сервер может читать данные json и делать это без ошибок, и Я уверен, что объект QueryResponse переполнен данными., но я ничего не могу получить на стороне клиента, responseText и responseJson равны нулю.

Почему плагин struts-json не преобразовал мой объект QueryResponse в строку json automaticaly?

моего QueryResponse класс:

public class QueryResponse { 

    private int total; 

    private List<?> data; 

    public int getTotal() { 
     return total; 
    } 

    public void setTotal(int total) { 
     this.total = total; 
    } 

    public List<?> getData() { 
     return data; 
    } 

    public void setData(List<?> data) { 
     this.data = data; 
    } 


} 

фактический тип списка данных содержит должен быть определен во время выполнения, например, если данные содержит список объектов Роли: пакета gov.cbrc.gzbanking.domain;

public class Role { 

    private String id; 

    private String name; 

    private String remark; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

тогда ожидаемый результат таков:

{ 
total : "1", data :[{"id":"admin", "name":"admin role"}] 
} 
+0

Вы используете только один перехватчик для вашего действия. Использовать перехватчик стека + json по умолчанию. –

+0

R u использует Struts 2 JSON Plugin? – xrcwrn

ответ

0

Я думаю, что вы не читаете данные должным образом на стороне клиента. Попробуйте следующее:

$.ajax({ 
    type: "POST", 
    url: "ds/query",  
    data :JSON.stringify(data), 
    dataType:"json", 
    contentType: "application/json; charset=utf-8", 
    success : function(d, t, x){ 
     console.log(t); 
     console.log(d[0].id); 
     console.log(d[0].name); 
    } 
}); 
1

Потому что вы используете Struts2. Struts2 используется для того, чтобы загладить имя свойства для определения метода геттера, прежде чем имя метода «get» может быть разрешено с помощью свойства "qRes" с заглавной буквыми до "QRes" и с префиксом «get». Таким образом, имя метода будет getQRes. Вы можете удалить root параметр из результата и посмотреть, если оно может быть использовано в противном случае, или переименовать имя метода геттер, как

public QueryResponse getQRes() { 
    return qRes; 
} 

Вы также можете прочитать this вопрос о том, почему сгенерированные методы получения и установки в Eclipse, не работают с Struts2 OGNL.

+0

Я теперь использую Gson для сериализации объектов для json. но я дам ему тест позже на то, что вы сказали, спасибо. –

Смежные вопросы