2014-05-08 149 views
0

我有一類類似下面Java表達式解析得到對象

public class ParentDTO 
{ 
    private String name; 
    private List<Child> childs; 
    .... getters and setters 
} 

我想從一個表達式獲得的第N個孩子的名字。

String sQuery ="childs[0].name"; 

現在我想從父DTO object

public String getChildName(ParentDTO paretnDTO, String query) 
{ 
    // will return first child name when i pass 
    // query as sQurey 
    // please help to implment 
} 
+1

關鍵字爲你谷歌:阿帕奇百科全書的BeanUtils或MVEL,或SPEL –

+0

感謝琛得到的答案 – user3580890

+0

@ user3580890你能那麼爲其他人的利益發布答案? – Jason

回答

2

(如評論的要求@Jason得到那個孩子的名字,並作爲OP似乎已經做了他的研究的責任,這裏是一個回答這給一些詳細信息)

有我們可以採取兩種主要的方法,兩者在某些方面相似:

方法1:Java的衣n屬性

如果您知道您正在檢查的POJO對象是一個Java Bean(至少包含適合其屬性的getter/setters),那麼您可以使用一些Java Bean Utils,其中一些甚至提供了擴展語法來導航Bean屬性。 Apache的公共BeanUtils的是一個例子:

// syntax not checked, just base on my memory. It should be close though. 
String child0name = BeanUtils.getProperty(parentDto, "children[0].name"); 

方法2:表達式語言

如果你要處理更復雜的表達,或者你處理的對象不是一個嚴格的bean(例如,你需要調用該對象的方法),那麼你可以考慮使用表達式語言引擎。有很多選擇,SpEL和MVEL是其中兩個。

通常這些表達式語言能提供什麼豆utils的可以提供,如:

String child0name = Mvel.eval("children[0].name", parentDto); 
// or if you want to call the method and do some more complicated expression, 
// you can do it: 
String child0name = Mvel.eval(
     "children[0].title + ' ' + children[0].constructFullName()", 
     parentDto);