Използване на struts2 json плъгин

Имам абстрактен клас, който изглежда по следния начин с подходящи гетери и сетери за частни свойства (оставени, за да запазя сортирането на публикацията):

public abstract class CityDistanceAwareAction extends BaseAction implements Preparable {
  private CityDistanceRepository cityDistanceRepository;

  private CityRepository cityRepository;

  private String cityA;

  private String cityB;

  private CityDistance cityDistance;

  public void prepare() {
    if (StringUtils.isNotBlank(cityA) && StringUtils.isNotBlank(cityB)) {
      CityPair cityPair = new CityPair(getCityRepository().findByName(cityA), getCityRepository().findByName(cityB));
      setCityDistance(getCityDistanceRepository().load(cityPair));
    }
  }
}

И тогава имам много прост клас, който изглежда по следния начин:

public class SearchCityDistanceAjaxAction extends CityDistanceAwareAction {

  @Override
  public String perform() {
    if (getCityDistance() == null) {
      addActionError("No city distance found for that pair");
      return ERROR;
    }
    return SUCCESS;
  }
}

Идеята е, че мога да изпратя String cityA и String cityB. Направете моите справки и просто върнете обекта cityDistance чрез AJAX.

Когато настроя действието си struts.xml както следва:

<action name="searchCityDistance" class="searchCityDistanceAjaxAction">
  <result type="json">
    <param name="includeProperties">
      cityDistance.*
    </param>
  </result>
  <result name="error" type="json">
    <param name="ignoreHierarchy">false</param>
    <param name="includeProperties">
      actionErrors.*
    </param>
  </result>
</action>

Получавам следното връщане:

(CommonsLogger.java:68) - Добавяне на израз на свойство включват: cityDistance.* (CommonsLogger.java:68) - [JSON]{}

Но очаквах да получа обратно обекта cityDistance.*, предоставен от гетъра в абстрактното CityDistanceAwareAction.

Достатъчно интересно, ако добавя специален инструмент за получаване на обекта SearchCityDistanceAjaxAction като следното:

  public CityDistance getAjaxCityDistance() {
    return getCityDistance();
  }

и променете файла struts на:

  <result type="json">
    <param name="includeProperties">
      ajaxCityDistance.*
    </param>
  </result>

Дава ми това, което очаквах от първия си опит.

(CommonsLogger.java:68) - Добавяне на израз на свойство включват: ajaxCityDistance.* (CommonsLogger.java:68) - [JSON]{"ajaxCityDistance":{"cityPair":{"cityA":{"cityName":"American Falls ","id":68},"cityB":{"cityName":"Ririe","id":119}},"distance":85}}

Би било идеално да премахна getter от моя SearchCityDistanceAjaxAction, тъй като getter вече е предоставен в родителя. Има ли нещо, което пропускам тук или това е начинът, по който трябва да функционира?

Благодаря предварително.


person buzzsawddog    schedule 25.09.2013    source източник
comment
Имате ли публичен getCityDistance() метод във вашия CityDistanceAwareAction клас?   -  person Aleksandr M    schedule 26.09.2013
comment
Да, има getCityDistance() метод в CityDistanceAwareAction.   -  person buzzsawddog    schedule 26.09.2013


Отговори (1)


Успях да променя моя struts.xml файл на следното:

<action name="searchCityDistance" class="searchCityDistanceActionAjaxAction">
  <result type="json">
    <param name="ignoreHierarchy">false</param>
    <param name="excludeProperties">
      cityDistanceRepository
    </param>
    <param name="includeProperties">
      cityDistance.*
    </param>
  </result>
  <result name="error" type="json">
    <param name="ignoreHierarchy">false</param>
    <param name="includeProperties">
      actionErrors.*
    </param>
  </result>
</action>

Но все пак мирише малко на риба да използвам excludeProperties, за да пропусна моето cityDistanceRepository. Ако така трябва да бъде, предполагам, че ще направя това, но се надявам, че има по-добро решение.

person buzzsawddog    schedule 25.09.2013
comment
struts.apache.org/release/2.1.x/docs/ json-plugin.html – ясно посочва, че includeProperties приема регулярен израз и следователно cityDistance.* съвпада с всички полета с cityDistance в името си. Можете просто да пропуснете нещото (.*) и то ще работи както се очаква без exludeProperties. - person coding_idiot; 26.09.2013
comment
@coding_idiot Виждате, че това е, което аз, но... Когато правя само cityDistance, той изпраща празен обект. - person buzzsawddog; 26.09.2013
comment
@coding_idiot добре, така че отидох тази сутрин, когато влязох на работа, и опитах това, което ми предложи. Премахнах .* и excludeProperties и получавам следното върнато (CommonsLogger.java:68) - Adding include property expression: cityDistance и (CommonsLogger.java:68) - [JSON]{"cityDistance":{}}, както виждате, че е празно :-( - person buzzsawddog; 26.09.2013
comment
Може ли да се сериализира CityDistance? - person coding_idiot; 26.09.2013
comment
@coding_idiot да, наистина е така. Трябваше да проверя отново, но може да се сериализира. Както и неговите компоненти. - person buzzsawddog; 27.09.2013