2013-09-25 68 views
0

我有一個抽象類,它看起來像一個適當的getter和setter私人性質(左守到後排序)如下:使用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; 
    } 
} 

這個想法是我可以發送一個字符串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.*對象返回pr在摘要CityDistanceAwareAction中受到吸氣者的歡迎。

有趣的是,如果我添加SearchCityDistanceAjaxAction對象像下面的一個特殊的getter:

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

,改變支柱文件到:

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

它給我什麼,我從我的第一預期嘗試。

(CommonsLogger.java:68) - 添加包括屬性表達式: ajaxCityDistance *(CommonsLogger.java:68) - [JSON] { 「ajaxCityDistance」:{ 「城市對」:{ 「cityA」: {「cityName」:「美國 Falls」,「id」:68},「cityB」:{「cityName」:「Ririe」,「id」:119}},「distance」:85}}

這將是理想的從我的SearchCityDistanceAjaxAction中刪除吸氣劑,因爲吸氣劑已經在母體中提供。有什麼我在這裏失蹤或這是它應該的功能?

在此先感謝。

+1

你在'CityDistanceAwareAction'類中有公共'getCityDistance()'方法嗎? –

+0

是的,'CityDistanceAwareAction'中有一個'getCityDistance()'方法。 – buzzsawddog

回答

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。如果這是如何,我想這是我會做的,但希望有一個更好的解決方案。

+0

http://struts.apache.org/release/2.1.x/docs/json-plugin.html - 它明確指出includeProperties需要使用正則表達式,因此cityDistance。*會匹配其名稱中帶有cityDistance的所有字段。你可以簡單地跳過(。*)的東西,它會像預期的那樣工作,而不需要exludeProperties。 –

+0

@coding_idiot你看到多數民衆贊成我雖然,但是...當我只做cityDistance它發送一個空的對象。 – buzzsawddog

+0

@coding_idiot好吧,所以我今天早上去上班時,嘗試了你的建議。我刪除了'。*'和'excludeProperties',我得到以下返回的'(CommonsLogger.java:68) - 添加包含屬性表達式:cityDistance'和'(CommonsLogger.java:68) - [JSON] {「cityDistance 「:{}}'因爲你可以看到它是空的:-( – buzzsawddog

相關問題