Spring EL可以用作有效的查询语言吗?

时间:2014-11-28 14:00:19

标签: java spring spring-el

有没有人知道spel是否可以像xpath一样用作查询语言?

我的用例是我正在使用Spring RestTemplate来对我们正在编写的应用程序进行集成测试的http请求。响应数据是json,而不是创建响应绑定的少数几个域类,我将响应绑定到标准java.util.Map

(简化)典型响应可能如下所示:

{
    'links': [
        {
            'rel':'self', 
            'href':'http://somesite.com:49156/places', 
            'lastModified':'2014-11-27T21:42:49Z'
        }, 
        {
            'rel':'place',
            'href':'http://somesite.com:49156/places/2345',
            'lastModified':'2014-11-27T21:42:49Z'
        }
    ]
}

鉴于此数据绑定到Map,我们可以根据调用Map等的get方法编写断言。
例如,如果我想断言'self'链接的href是'http://somesite.com:49156/places',我将不得不:

  • 在响应正文Map上调用.get(“links”),并将其转换为List<Map>
  • 循环生成结果列表,并为每个条目(即地图)调用.get(“rel”)并检查它的值是否为“self”
  • 一旦我有了正确的Map(即'self'链接),我就会调用.get(“href”)并根据我的预期确定其值

唷!凌乱,脆弱,令人讨厌的代码!在很多层面都很糟糕!

所以,我现在想看看spel是否可以帮助我 我仍然喜欢将json响应绑定到一个好的通用Map的想法,因为我们将测试许多不同的端点,而响应对象图可能非常复杂 - 总而言之我们最终会很多很多的pojo's 虽然测试简单地调用getter和其他类似的辅助方法非常方便,但似乎没有必要创建很多很多类。 所以绑定到Map很容易,因为它不涉及任何工作:)但是如何测试它......

如果这是XML(不是),我们可以按照以下方式编写一个xpath查询:

//links/link[rel='self']/href

所以如果可以的话,我想尝试用spel做类似的事情。

  • 表达式[links]会返回List Map的<{1}}
  • 表达式[links][0]将获得List
  • 中的第一个条目
  • ,表达式[links][0][href]将从第一张地图中获取条目,其中键为'href'

但我需要能够有效地将表达式的[0]部分替换为“让我成为'rel'条目具有'self'值的人 - 我基本上想要使用spel作为查询语言。

有人知道这是否可行?

谢谢, 森

PS。由于这是一个Spring项目,我已经了解了MockMvc和JsonPath。 MockMvc在这种情况下是不正确的,因为这些测试是完整的端到端,所以不需要模拟任何东西。回复:JsonPath,这个项目的技术主管非常不喜欢它,所以我被要求调查替代方案:(

0 个答案:

没有答案