2013-09-25 35 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

相关问题