0

我有一个抽象类,如下所示,带有用于私有属性的适当的 getter 和 setter(为了保持帖子排序而省略):

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

这个想法是我可以发送字符串 cityA 和字符串 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.*抽象中 getter 提供的对象CityDistanceAwareAction

有趣的是,如果我在SearchCityDistanceAjaxAction对象上添加一个特殊的 getter,如下所示:

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

最好从 my 中删除 getter,SearchCityDistanceAjaxAction因为父级中已经提供了 getter。这里有什么我遗漏的东西还是它应该起作用的方式?

提前致谢。

4

1 回答 1

0

我能够将我的 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 仍然有点可疑。如果这是必须的,我想这就是我要做的,但希望有更好的解决方案。

于 2013-09-25T16:40:44.390 回答