使用struts2 json插件

时间:2013-09-25 16:14:04

标签: java json struts2 struts2-json-plugin

我有一个抽象类,看起来像下面的私有属性的适当的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;
  }
}

我的想法是我可以发送一个String cityA和String cityB。做我的查找并简单地通过AJAX返回cityDistance对象。

当我按如下方式设置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] {&#34; ajaxCityDistance&#34; {&#34;城市对&#34; {&#34; cityA&#34; {&#34;的cityName&#34;:&#34;美国   瀑布&#34;&#34; ID&#34; 68},&#34; cityB&#34; {&#34;的cityName&#34;:&#34; Ririe&#34;&#34; ID& #34; 119}},&#34;距离&#34; 85}}

理想的是从我的SearchCityDistanceAjaxAction中移除getter,因为父级已经提供了getter。我在这里缺少什么,或者它应该如何运作?

提前致谢。

1 个答案:

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