2014-01-21 17 views
2

Im通過使用Sprint MVC 4.0框架公開REST服務,並且我嘗試遵循對$查詢參數(如$ filter,$ search和$ orderBy)的Odata規範。其中每個都包含我需要解析的表達式,構建抽象語法樹並進行驗證。它們都以字符串形式檢索。使用Odata4j爲查詢參數表達式創建抽象語法樹

我不需要在OData的語法(http://docs.oasis-open.org/odata/odata/v4.0/cos01/abnf/odata-abnf-construction-rules.txt)中定義的所有建築,我只挑那些有關我的使用情況下(極少數確實)中的那些

我想就怎麼有些尖以簡單的方式解析和構建抽象樹,如果Odata4j可能被用作實用程序庫來爲我完成這項工作?我想避免將大量新的依賴拖到odata4j,因爲我只會使用一小段代碼。

回答

1

您當然可以使用odata4j爲查詢參數構建AST。我已經完成了你引用的目的。我分開查詢參數,然後再次分開'&'以獲取參數。對於其中的每一個,我都會檢查參數名稱($ select,$ filter等),然後基於該值對該值使用相應的OptionsQueryParser靜態方法,返回特定於該查詢參數的數字,列表或AST。對於表達式AST,請查看PrintExpressionVisitor並將其用作編寫自己的訪問者以走AST的模式。

+0

湯姆,這聽起來像我正在尋找的東西。你有沒有可以分享的代碼? –

+0

我相信你可以在這裏看到模式並自己完成它。 String queryString = uri.substring(uri.indexOf('?')+ 1); (String segment:queryString.split(「&」)) \t String [] paramPair = segment.split(「=」); \t String name = paramPair [0] .trim(); \t String value = paramPair [1] .trim(); \t if(name.equals(OPTION_SELECT)){ \t \t select = OptionsQueryParser.parseSelect(value); \t} else if(name.equals(OPTION_FILTER)){ \t \t filter = OptionsQueryParser.parseFilter(value); \t} else if(name.equals(... – Tom

+0

謝謝,湯姆。是的,這很簡單。現在我正在嘗試做最後一部分答案:走過濾器AST構建我的查詢。 –