1

我继承了一个使用 JBoss、Spring、Hibernate 等的 REST API,而且我对所有这些都是新手,所以请原谅(对我来说)看似愚蠢的问题。

执行 GET 时的基本流程是构建实体列表,将其添加到 ModelAndView 对象,然后返回。

问题: 如何将计算值添加到响应中?

我不想将计算值存储在数据库中,也不想为每个返回的实体添加一个成员(即ArrayList<Athletes>,在 Athletes 类中添加一个“领导者后面的点”成员)。我只是想对每个请求执行计算并将一个成员附加到具有该动态值的 json 响应中,如下所示:

{
"Athlete1" : {"name" : "bob", "someDynamicValue" : "124548412" }
}

似乎这会比较常见,但我似乎无法找到一个简单的解决方案......也许我只是不确定如何正确地提出这个问题。

任何帮助,将不胜感激。

PS - 我认为这会帮助我使用 Spring 在 Rest API 中返回实体,但答案从未解决我的问题,即如何向响应添加动态值。

编辑:根据请求,这里有一些简化的代码

public ModelAndView getAthletes(HttpServletRequest req, HttpServletResponse res) 
    throws WebServiceException {

        res.setContentType("text/xml");

        List<AthleteStat> athleteStats = athleteManager.getAthleteStats();


        Map<String, Object> model = new HashMap<String, Object>();


        model.put("athleteStats", athleteStats);

        ModelAndView modelAndView = new ModelAndView("athletes.ftl", "model", model);
        modelAndView.setCacheable(true);

        return modelAndView;        

    } 



public class AthleteStat{

    private Long id;
    private String name;
    private String hometown;
        private String resides;
    private Date birthdate;

    //getters and setters

}



<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<#escape x as x?xml>
<response status="ok">
    <Data>      
        <Athletes>
        <#list model.athleteStats as athleteStat>
            <Athlete Name="${athleteStat.athlete.name}" InternalID="${athleteStat.athlete.id?c}">
                <AbbrevName><#if athleteStat.athlete.abbrevName?exists>${athleteStat.athlete.abbrevName}</#if></AbbrevName>
                <Birthdate><#if athleteStat.athlete.birthdate?exists>${athleteStat.athlete.birthdate?string("yyyy-MM-dd'T'HH:mm:ss")}</#if></Birthdate>
                <Hometown><#if athleteStat.athlete.hometown?exists>${athleteStat.athlete.hometown}</#if></Hometown>
                <Resides><#if athleteStat.athlete.resides?exists>${athleteStat.athlete.resides}</#if></Resides>
                <Age><#if athleteStat.athlete.age?exists>${athleteStat.athlete.age}</#if></Age>
            </Athlete>
        </#list>
        </Athletes>
    </Data>
</response>
</#escape>
4

1 回答 1

1

您可以在模型中添加一个附加映射,将这些动态值映射到每个运动员。

像这样:你在哪里

model.put("athleteStats", athleteStats);

添加动态值图的生成并添加到模型中:

model.put("athleteStats", athleteStats);
Map<Integer, String> dynamicValues = new HashMap<Integer, String>();
for(AthleteStat athleteStat : athleteStats) {
   String dynValue = athleteStat.toString(); /* calculate the dynamic value */
   dynamicValues.put(athleteStat.getId(), dynValue);
}
model.put("dynamicValues", dynamicValues);

现在添加这一行来映射它:

<Dynamic>
    <#if model.dynamicValues.get(athleteStat.athlete.id)?exists>
        ${model.dynamicValues.get(athleteStat.athlete.id)}
    </#if>
</Dynamic>

喜欢:

...
        <Age><#if athleteStat.athlete.age?exists>${athleteStat.athlete.age}</#if></Age>
        <Dynamic><#if model.dynamicValues.get(athleteStat.athlete.id)?exists>${model.dynamicValues.get(athleteStat.athlete.id)}</#if></Dynamic>
    </Athlete>
</#list>
于 2013-05-18T22:07:03.910 回答