Struts2 возвращает пустой JSON в моем вызове AJAX - PullRequest
2 голосов
/ 08 ноября 2011

Я изо всех сил пытаюсь получить ответ JSON от моего класса Struts2 Action, я думаю, что что-то упустил.У меня в Project есть следующие настройки.

в моем определении действия на уровне модуля, конфигурация выглядит следующим образом:

<package name="customer" namespace="/" extends="struts-default,json-default">
   <action name="getCustomer" method="getCustomerBusiness" class="CustomerAction">
      <result type="json"/>
   </action>
</package>

в моем Struts.xml У меня есть

 <result-types>
    <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
 </result-types>

 <interceptors>
    <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
 </interceptors>

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

  public class CustomerAction extends ActionSupport implements ServletRequestAware,
        ServletResponseAware, ModelDriven {
    private List<CustomerBean> cpbeanList;

    public List<CustomerBean> getCpbeanList() {
        return cpbeanList;
    }

    public void setCpbeanList(List<CustomerBean> cpbeanList) {
        this.cpbeanList = cpbeanList;
    }

    public String getCustomerBusiness() {
        cpbeanList = new ArrayList<CustomerPortfolioBean>();
        // jsonData = new LinkedHashMap<String, Object>();
        CustomerBean cb1 = new CustomerPortfolioBean();
        cb1.setBusinessNm("IBM");
        cb1.setBusinessAddr("475 Anton Blvd");
        cb1.setBusinessPh("00000000");
        cb1.setBusinessCity("Costamesa");
        cb1.setBusinessStateCd("CA");
        c1.setBusinessZip("92704");

        similarly cb2, cb3, cb4.

        cpbeanList.add(cb1);
        cpbeanList.add(cb2);
        cpbeanList.add(cb3);
        cpbeanList.add(cb4);
        return SUCCESS;
    }

}

Запрос JSON http://localhost:8080/customer/getCustomer возвращает мне пустой массив {} В firebug ... Я могу видеть.

Также япробуя положить в качестве ввода данных таблицы в JQuery.который не имеет строки из-за этого.

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Суперкласс вашего действия реализует ModelDriven, следовательно, ваш подкласс тоже. Это модель, которая будет сериализована как JSON. Если модель пуста, сериалировать нечего, поэтому вы ничего не получите обратно.

Ваш подкласс должен переопределить getModel() и вернуть данные, которые вы хотите сериализовать, в JSON.

1 голос
/ 28 января 2016

С

  • Перехватчик ModelDriven выдвигает модель поверх ValueStack
  • Результат Json сериализует все действие

и зная, что

  • Результат Json имеет параметр root, который можно настроить для ограничения сериализации Json одним элементом вместо атрибута всего действия
  • Параметр root принимает OGNL

мы можем сделать предположение, что можно было бы дать указание вернуться назад ,
, чтобы быть менее ограничительным (с точки зрения модели), а не более ограничительным, как обычно.

Вы можете попробовать сделать что-то вроде

<result type="json">
    <param name="root">
        [1]
    </param>
</result>

или даже лучше (поскольку не гарантируется, что [1] является действием)

<result type="json">
    <param name="root">
        #action
    </param>
</result>

чтобы узнать, возможно ли на самом деле сериализовать все действие, поддерживая Модель поверх ValueStack.

...